SQLite是一个开源的嵌入式关系数据库,他的一大好处是在程序内部不需要网络配置,也不需要管理,他只依赖于文件系统,开销小,适用于嵌入式设备。
一:扩展SQLiteOpenHelper类提供数据访问接口
SQLiteOpenHelper对数据库实现了很好的封装,如果在打开之前就创建或者更新数据库,则可以用这个类来实现。
1:创建一个MySQLite类,继承自SQLiteOpenHelper类。
2:构造函数:
参数简介:
第一个:当前Activity对象,即context;第二个:数据库名,为以后再data/data/包名/database/下面寻找的文件名,一般形如:****.db;
第三个:为了创建游标对象,一般为null;第四个:版本号,为了以后表结构的更新准备,每更新一次表结构版本号就至少要增1,从而区分不同版本下的数据库。
3:重写onCreate方法,这个方法主要完成数据库中表的创建。
简介表的创建语句:create table 表名(_id 类型 约束(如:primary key autoincrement主键自增),列名1 类型 约束(如:not null不为空),列名2 类型 约束);
特别注意:表中的主键必须为“_id”.
@Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table user(_id integer primary key autoincrement,name text not null)"); } |
4:重写onUpgrade方法,这个方法用于数据库更新表结构时的操作。一般为:
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS 表名");// 如果数据库存在了这个表,那么删除这个表,重新创建 db.execSQL("新的创建表的语句"); } |
二:数据库的增删改查基本操作
1:操作对象
数据库的增删改查四中操作中,需要用到两种对象,分别为:
private SQLiteDatabase dbWriter;//获得数据库可写操作的对象 private SQLiteDatabase dbReader;//获得数据库可写操作的对象 |
2:增加操作
(1)获得ContentValues对象
ContentValues cv = new ContentValues(); |
(2)调用ContentValues对象的put("键(数据库列名)","值")的方法完成数据的暂存
cv.put("列名",值); |
(3)调用dbWriter对象的insert方法,完成数据到数据库的操作。参数为(“表名”,约束,ContentValues对象)。
dbWriter.insert("表名", 约束, ContentValues对象); |
3:查询操作
(1)创建Cursor对象,接收dbReader的query方法查询出来的数据表中的一个元组(就是一行信息)。参数为(表名,6个null(表示约束为默认))
Cursor cursor = dbReader.query("user", null, null, null, null, null, null); |
(2)创建String类型的对象,接收根据某一个列名所取得的值。
String str = cursor.getString(cursor.getColumnIndex("列名")); |
(3)根据Cursor对象的moveToNext()方法的判断,来进行数据的输出等操作。
4:删除操作
调用dbWriter的delete方法,完成删除操作。参数为(“表名”,约束,默认值null)。
dbWirter.delete(表名, 约束, 默认值null); |
5:修改操作
(1)获得ContentValues对象
ContentValues cv = new ContentValues(); |
(2)调用ContentValues对象的put("键(数据库列名)","修改后的值")的方法完成数据的修改
cv.put("列名", "修改后的值"); |
(3)调用dbWriter对象的update方法,完成数据修改与数据库的同步。参数为("表名", ContentValues对象, 约束, 默认值null);
dbWriter.update("表名", ContentValues对象,约束, 默认值null); |
三:数据库与ListView的联合使用
1:SimpleCursorAdapter的使用
数据库中的数据与ListView的组合使用用到了这个对象,且只能用这个对象
(1)声明SimpleCursorAdapter对象
private SimpleCursorAdapter adapter; |
(2)构造方法实例化SimpleCursorAdapter对象。
参数(当前Activity对象,列表中列表项的显示样式文件,数据源Cursor(这里为null,因为暂时没有),new String[]{"数据库中的列名(有几个写几个)"},new int[]{"列表中列表项的显示样式文件中控件的ID"})。
adapter = new SimpleCursorAdapter(this,列表项样式文件, 数据源null, new String[] {数据库表的列名 }, new int[] { 样式表中控件ID}); |
(3)在 查询数据库的方法中通过SimpleCursorAdapter对象的changeCursor(Cursor对象)方法,实现重新适配。
adapter.changeCursor(cursor对象); |
(4)通过setListAdapter(SimpleCursorAdapter对象)的方法绑定adapter。
setListAdapter(adapter);// 绑定adapter |
2:特别注意:在主Activity对应的xml文件中的listView的id必须固定为:android:id="@android:id/list"。
四:综合应用
功能:通过数据库与SimpleCursorAdapte的联合使用,使得ListView中的数据从数据库中而来。
◆扩展SQLiteOpenHelper类提供数据访问接口
public class MySqklite extends SQLiteOpenHelper { //构造函数,注意参数的填写 public MySqklite(Context context) { super(context, "quan.db", null, 4); } //重写onCreate方法,完成数据库表的创建 @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table user(_id integer primary key autoincrement,name text not null)"); } //重写onUpgrade方法 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("drop table if exists user");//数据库中如果存在这个表就删除这个表 //重新创建一个表的结构 db.execSQL("create table user(_id integer primary key autoincrement,name text not null,sex text not null)"); } |
◆主Activity
public class MainActivity extends ListActivity { private SQLiteDatabase dbWriter;// 获得数据库可写操作的对象 private SQLiteDatabase dbReader;// 获得数据库可写操作的对象 private MySqklite mySqlite;// 声明继承自SQLiteOpenHelper类的MySqklite对象 private SimpleCursorAdapter adapter;// 声明SimpleCursorAdapter对象 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mySqlite = new MySqklite(this);// 实例化MySqklite对象 dbWriter = mySqlite.getWritableDatabase();// 获得数据库可写操作权限 dbReader = mySqlite.getReadableDatabase();// 获得数据库可读操作权限 // 添加数据 addDB(); // 实例化SimpleCursorAdapter对象,注意参数的填写 adapter = new SimpleCursorAdapter(this, R.layout.cell, null, new String[] { "name", "sex" }, new int[] { R.id.name_tv, R.id.age_tv }); setListAdapter(adapter); // updateDB();//修改数据 // deleteDB();//删除数据 selectDB();// 查询数据 } // 添加数据 public void addDB() { // 获得ContentValues对象 ContentValues cv = new ContentValues(); for (int i = 0; i < 5; i++) { if (i % 2 == 0) { cv.put("sex", "男"); } else { cv.put("sex", "女"); } // ContentValues对象的方法 cv.put("name", "我的名字是" + i); // dbWriter的dbWriter方法实现数据的同步 dbWriter.insert("user", null, cv); } } // 查询数据 public void selectDB() { // 游标存储数据 Cursor cursor = dbReader.query("user", null, null, null, null, null, null); // while (cursor.moveToNext()) {// 判断游标的移动 // String str = cursor.getString(cursor.getColumnIndex("name"));// // 得到游标中列名name对应值 // System.out.println(str);//输出值 // } // 重新适配 adapter.changeCursor(cursor); } // 删除数据 public void deleteDB() { dbWriter.delete("user", "_id=1", null); } // 修改数据 public void updateDB() { ContentValues cv = new ContentValues(); cv.put("name", "Hello");// 修改后的数据的存储 dbWriter.update("user", cv, "_id=2", null); } } |
(1)程序第一次运行时,要释放主Activity中的addDB和selectDB方法。在data/data/包名?database下的文件中,结果如图:
(2)再次释放updateDB方法和selectDB方法,看数据库中的结果如图:
(3)再次释放deleteDB和selectDB方法,结果如图所示: