SQLite数据存储
Android 集成了 SQLite 数据库。它存储在 /data/data/< 项目文件夹 >/databases/ 下。Android 开发中使用 SQLite 数据库 Activites 可以通过 Content Provider 或者 Service 访问一个数据库。
Android数据库中主要涉及到的类有:SQLiteOpenHelper、SQLiteDatabase、Cursor、Context。
(01)SQLiteOpenHelper:它是 SQLiteDatabase的辅助类,主要功能是辅助管理数据库,如管理数据库的创建和版本。
(02)SQLiteDatabase:它是Android SQLite的核心类,包括的内容主要有,数据库表格的创建、删除,数据的添加、更新、删除,数据的查找等。
(03)Cursor:游标。当需要查找数据库的时候,会用到游标;通过Cursor可以对查找的结果进行方便的操作。
(04)Context:上下文环境。它提供了简单的打开/关闭数据库的接口。
也就是说,我们可以通过SQLiteOpenHelper或Context,来创建/打开数据;然后通过SQLiteDatabase的接口对数据库的值进行操作;需要对数据库进行查找时,便会用到Cursor。
下面分别对它们进行简单的介绍
1 SQLiteOpenHelper
它是SQLiteDatabase的辅助类,有两个功能:第一,用来管理SQLite数据库的创建和版本。第二,当创建/打开/升级数据库时,可以实现相应的回调函数响应一定的动作。
继承SQLiteOpenHelper的话,需要实现3个方法:
第一,构造函数。并要求在构造函数中调用父类的构造函数
第二,onCreate(SQLiteDatabase)。这是创建数据库的回调函数。
第三,onUpgrade(SQLiteDatabase,int, int)。这是升级数据库的回调函数。
至于onOpen(SQLiteDatabase)方法,可以根据自己的意愿,选择是否覆盖。
1.1SQLiteOpenHelper构造函数
有如下两个构造函数
public SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
public SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler)第一个参数:Context类型,上下文对象。 第二个参数:String类型,数据库的名称 第三个参数:CursorFactory类型 第四个参数:int类型,数据库版本
第五个参数:DatabaseErrorHandler类型,数据库错误回调函数。
1.2 SQLiteOpenHelper常用API
1.3 SQLiteOpenHelper实例
HelloAndroid.java
package com.yarin.Android.HelloAndroid; import android.app.Activity; import android.content.Context; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.os.Bundle; import android.widget.Button; import android.util.Log; public class HelloAndroid extends Activity { private static final String TAG = "skywang-->HelloAndroid"; private static final String DB_NAME = "skywang_SQLiteOpenHelper_db"; private static final int VERSION = 1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 创建数据库 DatabaseHelper dbHelper = new DatabaseHelper(this, DB_NAME, null, VERSION); Log.d(TAG, "before call getReadableDatabase()"); // 只有调用了getWritableDatabase()方法或者getReadableDatabase()方法之后,才会创建或打开一个连接 // 即,才会调用onCreate() SQLiteDatabase db = dbHelper.getReadableDatabase(); Log.d(TAG, "dabase name="+dbHelper.getDatabaseName()); dbHelper.close(); } // SQLiteOpenHelper是一个辅助类,用来管理数据库的创建和版本他 public class DatabaseHelper extends SQLiteOpenHelper { public DatabaseHelper(Context context, String name, CursorFactory factory, int version) { //必须通过super调用父类当中的构造函数 super(context, name, factory, version); Log.d(TAG, "call databaseHelper constructor"); } @Override public void onCreate(SQLiteDatabase db) { Log.d(TAG, "call database onCreate"); } @Override public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { Log.d(TAG, "call database onUpgrade"); } @Override public void onOpen(SQLiteDatabase db) { Log.d(TAG, "call database onOpen"); } } }
打印结果如下:
D/skywang-->HelloAndroid(2712): call database onCreate
D/skywang-->HelloAndroid(2712): call database onOpen
D/skywang-->HelloAndroid(2712): dabase name=skywang_SQLiteOpenHelper_db
2 SQLiteDatabase
参考“3.2 Cursor实例”
3Cursor
3.1 Cursor说明
3.2 Cursor实例
HelloAndroid.java
package com.yarin.Android.HelloAndroid; importandroid.app.Activity; importandroid.content.Context; importandroid.content.ContentValues; importandroid.database.Cursor; importandroid.database.sqlite.SQLiteDatabase; importandroid.database.sqlite.SQLiteOpenHelper; importandroid.database.sqlite.SQLiteDatabase.CursorFactory; importandroid.os.Bundle; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; importandroid.util.Log; public classHelloAndroid extends Activity { private static final String TAG ="skywang-->HelloAndroid"; private static final String DB_NAME ="skywang_SQLiteOpenHelper_db"; private static final int VERSION_01 = 1; private static final int VERSION_02 = 1; private static final String TABLE_NAME ="person"; private static final String ATTR_ID ="id"; private static final String ATTR_NAME ="name"; private DatabaseHelper dbHelper = null; private SQLiteDatabase db = null; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); // 创建数据库 dbHelper = new DatabaseHelper(this,DB_NAME, null, VERSION_01); // 获取数据库对象 db = dbHelper.getWritableDatabase(); //创建表 //db.execSQL("CREATE TABLE IF NOTEXISTS person(id INTEGER PRIMARY KEY AUTOINCREMENT,name varchar(20))"); db.execSQL("CREATE TABLE IF NOTEXISTS " +TABLE_NAME+" ( " +ATTR_ID+" INTEGER PRIMARYKEY AUTOINCREMENT, " +ATTR_NAME +"varchar(20))"); // 插入数据(方法一) // INSERT INTO person (id, name) VALUES(20130225, 'anybody') /* db.execSQL("INSERT INTO " + TABLE_NAME +"(" + ATTR_ID + "," + ATTR_NAME+ ") VALUES" + "(20130225,'anybody')"); //*/ db.execSQL("INSERT INTO " + TABLE_NAME + " VALUES" + "(20130225,'anybody')"); printDatabase() ; // 插入数据(方法二) // 创建ContentValues对象 ContentValues values = new ContentValues(); values.put(ATTR_ID, 598435460); values.put(ATTR_NAME,"skywang"); // 调用insert方法,就可以将数据插入到数据库当中 // 第一个参数:表名称 // 第二个参数:SQl不允许一个空列,如果ContentValues是空的,那么这一列被明确的指明为NULL值 // 第三个参数:ContentValues对象 db.insert(TABLE_NAME, null, values); printDatabase() ; // 更新数据(方法一) //UPDATE Person SET Address = 'Zhongshan23', City = 'Nanjing' // WHERELastName = 'Wilson' db.execSQL("UPDATE " + TABLE_NAME + " SET" + ATTR_NAME+ " = 'nobody'WHERE " + ATTR_ID + " =20130225"); printDatabase() ; // 更新数据(方法二) // update()方法有四个参数,分别是表名,表示列名和值的 ContentValues 对象,可选的 WHERE 条件和可选的填充 WHERE 语句的字符串,这些字符串会替换 WHERE 条件中的“?”标记 values = new ContentValues(); String[] attStr = new String[]{"598435460"}; values.put(ATTR_NAME,"ghost_walker"); db.update(TABLE_NAME, values,ATTR_ID+"=?", attStr); printDatabase() ; printNobody() ; // 删除数据(方法一) // DELETE FROM person WHERE id =20130225 db.execSQL("DELETE FROM " +TABLE_NAME + " WHERE " + ATTR_ID + " =20130225"); printDatabase() ; // 删除数据(方法二) String[] args = newString[]{"598435460"}; db.delete(TABLE_NAME,ATTR_ID+"=?", args); printDatabase() ; Log.d(TAG, " delete all things inthe table."); // 删除表格内的全部数据 db.delete(TABLE_NAME,null,null); //db.execSQL("DELETE * FROM "+TABLE_NAME); printDatabase() ; } @Override public void onDestroy() { super.onDestroy(); if (dbHelper != null) dbHelper.close(); } // 打印出数据库的全部数据 private void printDatabase() { // SELECT * FROM person Cursor c = db.rawQuery("SELECT *FROM " + TABLE_NAME, null); Log.d(TAG, "===printdatabase==="); while(c.moveToNext()) { int index = c.getPosition(); int id =c.getInt(c.getColumnIndex(ATTR_ID)); String name =c.getString(c.getColumnIndex(ATTR_NAME)); Log.d(TAG,"line-"+index+" : "+"id="+id+",name="+name); } } // 查找name=nobody,并打印出结果 private void printNobody() { // query方法一 // 说明:字符串需要用单引号(')括起来 // SELECT id, name FROM person WHEREname='nobody' Cursor c = db.rawQuery("SELECT" + ATTR_ID + " , " + ATTR_NAME + " FROM " + TABLE_NAME + " WHERE " + ATTR_NAME + "='nobody'", null); while(c.moveToNext()) { int id =c.getInt(c.getColumnIndex(ATTR_ID)); String name =c.getString(c.getColumnIndex(ATTR_NAME)); Log.d(TAG, "Method-01-->thenobody has been found: id="+id+", name="+name); } // query方法二 String[] columns=new String[]{ATTR_ID,ATTR_NAME}; String[] parms=newString[]{"nobody"}; c=db.query(TABLE_NAME, columns,ATTR_NAME+"=?",parms, null, null, null); while(c.moveToNext()) { int id =c.getInt(c.getColumnIndex(ATTR_ID)); String name = c.getString(c.getColumnIndex(ATTR_NAME)); Log.d(TAG, "Method-02-->thenobody has been found: id="+id+", name="+name); } } public class DatabaseHelper extendsSQLiteOpenHelper { public DatabaseHelper(Context context,String name, CursorFactory factory, int version) { //必须通过super调用父类当中的构造函数 super(context, name, factory,version); Log.d(TAG, "call databaseHelperconstructor"); } @Override public void onCreate(SQLiteDatabase db){ } @Override public void onUpgrade(SQLiteDatabasearg0, int arg1, int arg2) { } } }
打印结果如下:
D/skywang-->HelloAndroid(2661): ===print database===
D/skywang-->HelloAndroid(2661): line-0 : id=20130225, name=anybody
D/skywang-->HelloAndroid(2661): ===print database===
D/skywang-->HelloAndroid(2661): line-0 : id=20130225, name=anybody
D/skywang-->HelloAndroid(2661): line-1 : id=598435460, name=skywang
D/skywang-->HelloAndroid(2661): ===print database===
D/skywang-->HelloAndroid(2661): line-0 : id=20130225, name=nobody
D/skywang-->HelloAndroid(2661): line-1 : id=598435460, name=skywang
D/skywang-->HelloAndroid(2661): ===print database===
D/skywang-->HelloAndroid(2661): line-0 : id=20130225, name=nobody
D/skywang-->HelloAndroid(2661): line-1 : id=598435460, name=ghost_walker
D/skywang-->HelloAndroid(2661): Method-01-->the nobody has been found: id=20130225, name=nobody
D/skywang-->HelloAndroid(2661): Method-02-->the nobody has been found: id=20130225, name=nobody
D/skywang-->HelloAndroid(2661): ===print database===
D/skywang-->HelloAndroid(2661): line-0 : id=598435460, name=ghost_walker
D/skywang-->HelloAndroid(2661): ===print database===
D/skywang-->HelloAndroid(2661): delete all things in the table.
D/skywang-->HelloAndroid(2661): ===print database===
4Context
4.1Context自带的database接口
参考文献:
1, Android API文档
2,Android实现数据存储技术:http://www.cnblogs.com/hanyonglu/archive/2012/03/01/2374894.html