Android中的SQLite使用
首先创建数据库类
public class DBHandle {
private String SQL_NAME = "test";
private String DB_NAME = SQL_NAME + ".db";
/**
* 打开或创建数据库
*
* mContext
* */
public SQLiteDatabase openOrCreateDB(Context mContext) {
SQLiteDatabase db = mContext.openOrCreateDatabase(DB_NAME, Context.MODE_PRIVATE, null);
return db;
}
/**
* 关闭数据库
* */
public void closeDB(SQLiteDatabase db) {
db.close();
}
/**
* 创建表
*
* table_name 表名 condition 条件
* */
public void createTable(SQLiteDatabase db, String table_name,
String condition) {
String sql = "create table " + table_name + "(" + condition + ");";
db.execSQL(sql);
}
/**
* 添加数据
*
* table_name 表名 cv 以键值对的形式装载插入的数据
* */
public void insertDate(SQLiteDatabase db, String table_name,
ContentValues cv) {
db.insert(table_name, null, cv);// 执行插入操作
}
/**
* 删除数据
*
* table_name 表名 whereClause 删除的条件 whereArgs 删除的条件参数
* */
public void deleteDate(SQLiteDatabase db, String table_name,String whereClause,
String[] whereArgs) {
db.delete(table_name, whereClause, whereArgs);// 执行删除
}
/**
* 修改数据 table_name 表名 whereClause 修改条件 whereArgs 修改条件参数
*
* */
public void upDate(SQLiteDatabase db, ContentValues cv, String table_name,
String whereClause, String[] whereArgs) {
db.update(table_name, cv, whereClause, whereArgs);// 执行修改
}
/**
* 查找数据
*
* table_name 表名 columns 列名称数组 selection:条件子句,相当于where
* selectionArgs:条件语句的参数数组 groupBy:分组 having:分组条件 orderBy:排序类 limit:分页查询的限制
* */
public Cursor selectDate(SQLiteDatabase db, String table_name,
String[] columns, String selection, String[] selectionArgs,
String groupBy, String having, String orderBy, String limit) {
Cursor c = db.query(table_name, columns, selection, selectionArgs,
groupBy, having, orderBy, limit);// 查询并获得游标
return c;
}
}
关于 Cursor 的重要方法:
- close() 关闭游标,释放资源
- copyStringToBuffer(int columnIndex, CharArrayBuffer buffer) 在缓冲区中检索请求的列的文本,将将其存储
- getColumnCount() 返回所有列的总数
- getColumnIndex(String columnName) 返回指定列的名称,如果不存在返回-1
- getColumnIndexOrThrow(String columnName) 从零开始返回指定列名称,如果不存在将抛出IllegalArgumentException 异常。
- getColumnName(int columnIndex) 从给定的索引返回列名
- getColumnNames() 返回一个字符串数组的列名
- getCount() 返回Cursor 中的行数
- moveToFirst() 移动光标到第一行
- moveToLast() 移动光标到最后一行
- moveToNext() 移动光标到下一行
- moveToPosition(int position) 移动光标到一个绝对的位置
- moveToPrevious() 移动光标到上一行
if (cur.moveToFirst() == false)
{
//为空的Cursor
return;
}
访问 Cursor 的下标获得其中的数据
int nameColumnIndex = cur.getColumnIndex(People.NAME);
String name = cur.getString(nameColumnIndex);
现在让我们看看如何循环 Cursor 取出我们需要的数据
while(cur.moveToNext())
{
//光标移动成功
//把数据取出
}
当cur.moveToNext() 为假时将跳出循环,即 Cursor 数据循环完毕。
如果你喜欢用 for 循环而不想用While 循环可以使用Google 提供的几下方法:
- isBeforeFirst()
返回游标是否指向之前第一行的位置 - isAfterLast()
返回游标是否指向第最后一行的位置 - isClosed()
如果返回 true 即表示该游戏标己关闭
有了以上的方法,可以如此取出数据
for(cur.moveToFirst();!cur.isAfterLast();cur.moveToNext())
{
int nameColumn = cur.getColumnIndex(People.NAME);
int phoneColumn = cur.getColumnIndex(People.NUMBER);
String name = cur.getString(nameColumn);
String phoneNumber = cur.getString(phoneColumn);
}
Tip:在Android 查询数据是通过Cursor 类来实现的。当我们使用 SQLiteDatabase.query()方法时,就会得到Cursor对象, Cursor所指向的就是每一条数据。结合ADO.net 的知识可能好理解一点。
Cursor 位于 android.database.Cursor类,可见出它的设计是基于数据库服务产生的。
另外,还有几个己知的子类,分别为:
- AbstractCursor
- AbstractWindowedCursor
- CrossProcessCursor
- CursorWrapper
- MatrixCursor
- MergeCursor
- MockCursor
- SQLiteCursor