目录:
4、ListView的用法(充气泵LayoutInflater的用法)
一、在命令行中使用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 }