sqlite是Android上使用的一种轻量级数据库,sqlite本身是一个开源的小型数据库,它占用空间小,资源少,适用于各种嵌入式设备、移动终端等;
如何打开/创建一个数据库
//打开或创建test.db数据库
SQLiteDatabase db = openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null);
这样就可以在test.db没有的情况下,创建test.db,在已经存在的情况下,会打开这个数据库;数据库默认的生成路径为:
/data/data/[PACKAGE_NAME]/databases
可以通过
db.execSQL(String);
db.execSQL(String sql, String[] sqlArgs);
来执行sql语句;
除了上面的方式执行sql以外,还可以通过insert方法插入数据:
db.insert(String table, String nullColumnHack, ContentValues values);
通过下面方法更新数据:
db.update(String table, ContentValues values, String whereClause, String[] whereArgs) ;
通过delete 方法来删除数据;
int delete (String table, String whereClause, String[] whereArgs) ;
其中 ContentValues 是一个键值对数据结构,用法与HashMap类似;
ContentValues cv = new ContentValues();
cv.put("name", person.name);
cv.put("age", person.age);
查询方法:
public Cursor rawQuery (String sql, String[] selectionArgs) ;
public Cursor query(boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) ;
public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) ;
public Cursorquery(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) ;
第一种方法是直接通过sql语句来查询,其他几种是指定表名,字段,等等进行的查询;
每种方式都返回Cursor对象,指向的是数据库数据;
Cursor对象的主要用法
c.move(int offset); //以当前位置为参考,移动到指定行
c.moveToFirst(); //移动到第一行
c.moveToLast(); //移动到最后一行
c.moveToPosition(int position); //移动到指定行
c.moveToPrevious(); //移动到前一行
c.moveToNext(); //移动到下一行
c.isFirst(); //是否指向第一条
c.isLast(); //是否指向最后一条
c.isBeforeFirst(); //是否指向第一条之前
c.isAfterLast(); //是否指向最后一条之后
c.isNull(int columnIndex); //指定列是否为空(列基数为0)
c.isClosed(); //游标是否已关闭
c.getCount(); //总数据项数
c.getPosition(); //返回当前游标所指向的行数
c.getColumnIndex(String columnName);//返回某列名对应的列索引值
c.getString(int columnIndex); //返回当前行指定列的值
最后我们调用db.close(); 关闭数据库;
一般来说,我们不会让我们的上层业务代码直接使用原生的 SQLiteDatabase来进行数据库操作,而是通过继承SQLiteOpenHelper扩展一个类,用于进行相关的数据库操作;
通常来说,我们继承 SQLiteOpenHelper 的时候,需要实现 onCreate 和 onUpgrade 两个函数;
例如我们继承一个SQLiteOpenHelper类
public class DBHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "test.db";
private static final int DATABASE_VERSION = 1;
public DBHelper(Context context) {
//CursorFactory设置为null,使用默认值
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
//数据库第一次被创建时onCreate会被调用
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS person" +
"(_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age INTEGER, info TEXT)");
}
//如果DATABASE_VERSION值被改为2,系统发现现有数据库版本不同,即会调用onUpgrade
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("ALTER TABLE person ADD COLUMN other STRING");
}
}
针对于onCreate应该都知道了,就是数据库第一次被创建的时候被调用;
onUpgrade会在什么时候被调用呢?
因为在 SQLiteOpenHelper里面,构造函数:
public SQLiteOpenHelper (Context context, String name, SQLiteDatabase.CursorFactory factory, int version) ;
每次调用 该构造函数的时候,都会传入 version ,SQLiteHelper如果防线version与原有version不一致的时候,就会在调用原来创建数据库onCreate的地方改为去调用onUpgrade函数,这个时候,我们只需要在更新的apk的代码里面,增加对应的数据库DDL和DML的变更就可以了;
一般来说,我们使用Helper的方式是这样的;
SQLiteDatabase db = helper.getWritableDatabase();
通过 getWritableDatabase 函数,使得首次创建的时候SQLiteHelper的onCreate函数被调用到,从而使得数据库被创建;如果是数据库升级的话,则onUpgrade会被调用到;
这样的话,我们将上面使用Helper的代码给封装起来,放在某个数据库操作类中,供业务层调用就可以了;
上面的内容,主要是学习了 http://blog.csdn.net/liuhe688/article/details/6715983 这篇文章;