一、SQLite简介
1、SQLite是什么
SQLite是一款轻型的开源数据库,它为嵌入式而设计,而且目前已经在很多嵌入式产品中使用了它。
2、SQLite与Android
Android提供对SQLite的支持,具有丰富的API对数据库进行操作,方便开发。
3、相关工具
SQLite提供命令行操作,但对数据库管理不太方便,有很多优秀管理工具,可以很方便的建立和修改数据库、表。例如:SQLite Expert
二、Android中对SQLite的操作
数据库最基本的操作就是增、删、改、查。在Android中使用SQLite,增、删、改是非常简单的,而“查”因为要返回查询结果,稍微复杂一点。
1、增、删、改
增、删、改 分别有两种实现方式。
统一方式:第二个函数中,第一个参数是SQL语句,SQL中的参数用‘?’作占位符,第二个参数是与占位符对应的SQL参数。而第一个函数中SQL使用拼接方式可以实现与第二个函数一样的功能。
db.executeSQL(String sql);
db.executeSQL(String sql, Object[] bindArgs);//sql语句中使用占位符,然后第二个参数是实际的参数集
增、删、改 各自的方式:以下三个方法的第一个参数都是表示要操作的表名;insert中的第二个参数表示如果插入的数据某一列都为空的话,需要指定此行中某一列的名称,系统将此列设置为NULL;insert中的第三个参数是ContentValues类型的变量,是键值对组成的Map,key代表列名,value代表该列要插入的值;update的第二个参数也很类似,只不过它是更新该字段key为最新的value值,第三个参数whereClause表示WHERE表达式,比如“age > ? and age < ?”等,最后的whereArgs参数是占位符的实际参数值;delete方法的参数也是一样。
db.insert(String table, String nullColumnHack, ContentValues values);
db.update(String table, Contentvalues values, String whereClause, String whereArgs);
db.delete(String table, String whereClause, String whereArgs);
2、查
查询操作有如下几种方式:
db.rawQuery(String sql, String[] selectionArgs);
db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy);
db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);
db.query(String distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);
常常使用rawQuery()方式,第一个参数是SQL语句,需要传入的参数用“?”占位符表示,实际参数由第二个参数传入。
函数的返回值为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); //返回当前行指定列的值
三、使用实例
在使用Sqlite时,常常使用两个类来完成相关操作。
1、DBHelper类
DBHelper继承了SQLiteOpenHelper类,作为维护和管理数据库的基类。
数据库第一次创建时onCreate方法会被调用,执行创建表的语句。
public class DBHelper extends SQLiteOpenHelper{
private static final String DATABASE_NAME = "MyDB.db";
private static final int DATABASE_VERSION = 1;
public DBHelper(Context context){
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
//在这里完成创建表的工作
db.execSQL("CREATE TABLE IF NOT EXISTS [TableTest] "+
"([Col1] VARCHAR, [Col2] VARCHAR, [Col3] VARCHAR, [Col4] VARCHAR);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
}
}
2、数据实体
根据数据库建立对应数据实体。
3、DBManager类
public class DBManager {
private DBHelper helper;
private SQLiteDatabase db;
public DBManager() {
this(ContextUtil.getInstance());
}
public DBManager(Context context) {
helper = new DBHelper(context);
db = helper.getWritableDatabase();
}
/**
* 关闭数据库
*/
public void closeDB() {
db.close();
}
//在这里完成业务相关的操作
/*
* 查询SheInf指定记录
*/
public List<TableTestRow> QueryTableTest(String strSql) {
ArrayList<TableTestRow> tableTestRows = new ArrayList<TableTestRow>();
Cursor c = db.rawQuery(strSql, null);
while (c.moveToNext()) {
TableTestRow tableTestRow = new TableTestRow();
sheInfRow.setCol1(c.getString(c.getColumnIndex("Col1")));
sheInfRow.setCol2(c.getString(c.getColumnIndex("Col2")));
sheInfRow.setCol3(c.getString(c.getColumnIndex("Col3")));
sheInfRow.setCol4(c.getString(c.getColumnIndex("Col4")));
tableTestRows.add(tableTestRow);
}
c.close();
return tableTestRows;
}
}
此类中,使用了获取ContextUtil的类:
public class ContextUtil extends Application {
private static ContextUtil instance;
public static ContextUtil getInstance() {
return instance;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
instance = this;
}
}
参考资料: