一、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; } }
参考资料: