• Android基础3


      目录:

            1、在命令行中使用sqlite工具

            2、sqlite数据库的另一种增删改查

            3、sqlite中的事务处理

            4、ListView的用法(充气泵LayoutInflater的用法)

            5、simpleAdapter的用法

      一、在命令行中使用sqlite工具

          1 cmd adb shell 首先挂载到linux

          2 cd data/data/com.android.contacts.provider

          3 cd databases

          4 sqlite3 contacts 打开数据库 eg: sqlite3 contacts.db

          5 .tables 查看所有的表 eg: .table

          6 .schema 查看所有的创建表、视图的语句 eg: .schema

          7 .help 查看帮助 eg: .help

          8 .header(s) NO |OFF是否显示列头信息 eg: headers ON

          9 .mode MODE ?table? 指定数据显示风格 eg: .mode column

          10 .nullValue NULL空值数据显示问题 eg: .nullValue NULL

          案例:

          

      二、sqlite的另一种增删改查

          1、自定义的数据库帮助类:MyDataBaseOpenHelper

     1 package cn.tangjie.database;
     2 
     3 import android.content.Context;
     4 import android.database.sqlite.SQLiteDatabase;
     5 import android.database.sqlite.SQLiteOpenHelper;
     6 
     7 public class MyDataBaseOpenHelper extends SQLiteOpenHelper{
     8     private final static String name = "soyoung.db";
     9     private final static int version = 1;
    10 
    11     public MyDataBaseOpenHelper(Context context) {
    12         super(context, name, null, version);
    13     }
    14 
    15     @Override
    16     public void onCreate(SQLiteDatabase db) {
    17          // db.execSQL("CREATE TABLE IF NOT EXISTS person (name varchar(20) primary key, phone varchar(20)");
    18         db.execSQL("CREATE TABLE IF NOT EXISTS person (personid integer primary key autoincrement, name varchar(20), age INTEGER)");
    19         System.out.println("表创建成功!");
    20     }
    21 
    22     @Override
    23     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    24         db.execSQL("ALTER TABLE person ADD phone varchar(20) NULL");
    25 
    26     }
    27 }

      2、创建好数据库之后进行单元测试,判断数据库和表结构是否创建成功

    1     public void test(){
    2         
    3         new MyDataBaseOpenHelper(getContext()).getReadableDatabase();
    4     }

      提示:如果报一下的错误,基本上是由于创建表中的sql语句有错误

    android.database.sqlite.SQLiteException: Can't upgrade read-only database from version 0 to 1: /data/data/com。。。。

      3、编写数据库的操作类 完成数据库的增删改查:

     1 package cn.tangjie.database.dao;
     2 
     3 import cn.tangjie.database.MyDataBaseOpenHelper;
     4 import android.content.ContentValues;
     5 import android.content.Context;
     6 import android.database.Cursor;
     7 import android.database.sqlite.SQLiteDatabase;
     8 
     9 public class MyDatabase {
    10     private MyDataBaseOpenHelper helper;
    11 
    12     public MyDatabase(Context context) {
    13         this.helper = new MyDataBaseOpenHelper(context);
    14     }
    15 
    16     public void add(String name, int age) {
    17         if (find(name)) {
    18             return;
    19         }
    20         SQLiteDatabase db = helper.getReadableDatabase();
    21         ContentValues values = new ContentValues();
    22         values.put("name", name);
    23         values.put("age", age);
    24         db.insert("person", null, values);
    25     }
    26 
    27     public boolean find(String name) {
    28         SQLiteDatabase db = helper.getReadableDatabase();
    29         Cursor cusor = db.query("person", null, "name=?",
    30                 new String[] { name }, null, null, null);
    31         if (cusor.moveToFirst()) {
    32             return true;
    33         }
    34         return false;
    35     }
    36 }

      

      三、sqlite中的事务处理

           beginTransaction:启动事务

           endTransaction:停止事务

           setTransactionSuccessful:设置事务的标志为成功则提交事务,如果没有调用setTransactionSuccessful() 方法则回滚事务

           代码如下:

     1 SQLiteDatabase db = ....;
     2 db.beginTransaction();//开始事务
     3 try {
     4     db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"tangjie", 4});
     5     db.execSQL("update person set name=? where personid=?", new Object[]{"wangzhen", 1});
     6     db.setTransactionSuccessful();//调用此方法会在执行到endTransaction() 时提交当前事务,如果不调用此方法会回滚事务
     7 } finally {
     8     db.endTransaction();//由事务的标志决定是提交事务,还是回滚事务
     9 } 
    10 db.close(); 

       四、ListView的用法

            1、直接通过案例来看:使用LayoutInflater自定义listView的使用:

            第一步:编写items.xml文件:在xml文件中用两个文本组件来存放listView每个列表中的数据

     1  <TextView
     2         android:id="@+id/lv_name"
     3         android:layout_width="wrap_content"
     4         android:layout_height="wrap_content"
     5         android:text="@string/lv_name" />
     6 
     7     <TextView
     8         android:id="@+id/lv_tel"
     9         android:layout_width="wrap_content"
    10         android:layout_height="wrap_content"
    11         android:text="@string/lv_tel" />

           第二步:从数据库中取出数据,用于准备设置到listView中,这步类似于上面的crud操作,再次省略。

           第三步:Activity中的代码:设置listview的适配器,通过LayoutInflater充气泵将信息设置到items对应的组件上。

                     MyAdapter中的getCount方法决定listView的行数,决定着调用多少次getView方法的调用次数、getView方法不断地将组件设置到listview中 

    
    
     1 package com.lewu.listview;
     2 
     3 import java.util.List;
     4 
     5 import com.lewu.database.dao.MyDatabase;
     6 import com.lewu.domian.Person;
     7 
     8 import android.app.Activity;
     9 import android.os.Bundle;
    10 import android.view.LayoutInflater;
    11 import android.view.View;
    12 import android.view.ViewGroup;
    13 import android.widget.BaseAdapter;
    14 import android.widget.ImageView;
    15 import android.widget.ListView;
    16 import android.widget.TextView;
    17 
    18 public class ListviewActivity extends Activity {
    19 
    20     private ListView lv;
    21     private List<Person> persons;
    22     private LayoutInflater inflater;
    23     @Override
    24     public void onCreate(Bundle savedInstanceState) {
    25         super.onCreate(savedInstanceState);
    26         setContentView(R.layout.main);
    27         
    28         persons = new MyDatabase(this).findAll();
    29         
    30         System.out.println(persons.size());
    31 
    32         lv = (ListView) findViewById(R.id.lv);
    33         lv.setAdapter(new MyAdapter());
    34         
    35         inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
    36 
    37     }
    38 
    39     class MyAdapter extends BaseAdapter {
    40 
    41         @Override
    42         public int getCount() {
    43             return persons.size();
    44         }
    45 
    46         @Override
    47         public Object getItem(int position) {
    48 
    49             return null;
    50         }
    51 
    52         @Override
    53         public long getItemId(int position) {
    54             // TODO Auto-generated method stub
    55             return 0;
    56         }
    57 
    58         @Override
    59         public View getView(int position, View convertView, ViewGroup parent) {
    60             Person person = persons.get(position);
    61             View view = inflater.inflate(R.layout.items, null);
    62             TextView view1 = (TextView)view.findViewById(R.id.lv_name);
    63             TextView view2 = (TextView) view.findViewById(R.id.lv_tel);
    64             view1.setText(person.getName());
    65             view2.setText(person.getPhone());
    66             return view;
    67         }
    68 
    69     }
    70 }

    运行结果:
      
      

     五、simpleAdapter的用法

     1     public void onCreate(Bundle savedInstanceState) {
     2         super.onCreate(savedInstanceState);
     3         setContentView(R.layout.main);
     4 
     5         persons = new MyDatabase(this).findAll();
     6 
     7         System.out.println(persons.size());
     8 
     9         lv = (ListView) findViewById(R.id.lv);
    10 
    11         datas = new ArrayList<Map<String, String>>();
    12 
    13         for (Person p : persons) {
    14             Map<String, String> map = new HashMap<String, String>();
    15             map.put("name", p.getName());
    16             map.put("phone", p.getPhone());
    17             datas.add(map);
    18         }
    19 
    20         lv.setAdapter(new SimpleAdapter(this, datas, R.layout.items,
    25                 new String[] { "name", "phone" }, new int[] { R.id.lv_name,
    26                         R.id.lv_tel }));
    27 
    28     }

           

  • 相关阅读:
    WinForm 自定义查询
    维护应用程序状态(三):使用用户配置文件
    解决无法获取 GridView 中BoundField 隐藏列值问题
    Nhibernate Unknown entity class 的解决办法
    GridView 18般绝技(转)
    IsPostBack介绍
    "ESLG.CommonUtility.NHibernateHelper"的类型初始值设定项引发异常
    Visible和style.display的不同
    维护应用程序状态(二):使用会话状态
    AS3与PHP通信的五种方法(基于HTTP协议)
  • 原文地址:https://www.cnblogs.com/tagie/p/3063760.html
Copyright © 2020-2023  润新知