Android SQLite 使用总结
2020-06-08 本文已影响0人
惟吾德馨_慧
1.获取SQLiteOpenHelper
class DBOpenHelper extends SQLiteOpenHelper
2.查询语句
查询多条数据
SQLiteDatabase db = openHelper.getReadableDatabase();
Cursor cursor = db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit);
示例:
Cursor cursor = query(DBCommon.PersonRecordColumns.TABLE_NAME_PERSON_DATA, DBCommon.PersonRecordColumns.projects,
selection, selectionArgs, groupBy, having, orderBy, limit);
while (cursor.moveToNext()) {
list.add(getUserInfo4Cursor(cursor));
}
查询单条数据
SQLiteDatabase db = openHelper.getReadableDatabase();
Cursor cursor = db.rawQuery(sql, condition);
示例:
Cursor cursor = rawQuery("select * from " + DBCommon.PersonRecordColumns.TABLE_NAME_PERSON_DATA +
" where " + DBCommon.PersonRecordColumns.COLUMN_PERSON_PERSON_ID + " = ?", new String[]{personid});
模糊查询
参考链接:https://www.jianshu.com/p/a93586b0611b
1.%:表示任意0个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请运用两个百分号(%%)表示。
2._: 表示任意单个字符。匹配单个任意字符,它常用来限定表达式的字符长度语句
//查找数据表中名字中含有w、h、h任意字母的人员
String names = "name like ? or ? or ?"
ArrayList<String> selectionArgs = new ArrayList<>();
selectionArgs.add("%w%");
selectionArgs.add("%h%");
selectionArgs.add("%h%");
Cursor cursor = query(DBCommon.PersonRecordColumns.TABLE_NAME_PERSON_DATA, DBCommon.PersonRecordColumns.projects,
sb.toString(), (String[]) selectionArgs.toArray(new String[selectionArgs.size()]), null, null, null, null);
查询数量
//查询表中ryssztk含有某个关键字的数量
public int getRecordCount4ZTK(String ztkName) {
return rawQuery("select count(*) from " + DBCommon.PersonRecordColumns.TABLE_NAME_PERSON_DATA + " where ryssztk like ?",
"%" + ztkName + "%");
}
查询总结:
query():适用于多条数据的条件查询,不适合单条数据的查询;
rawQuery():适用于单条数据的条件查询,效率要高于query()。
3.插入数据
/**
* 插入单条数据
*
* @param cv ContentValues
* @return
*/
public synchronized int insert(String table, ContentValues cv) {
if (cv == null) {
return -1;
}
SQLiteDatabase db = null;
int id = -1;
try {
db = mOpenHelper.getWritableDatabase();
id = (int) db.insert(table, null, cv);
} catch (Exception e) {
e.printStackTrace();
} finally {
// if(db != null){
// db.close();
// }
}
return id;
}
/**
* 插入多条数据
*
* @param tableName 数据库的表名
* @param cv ContentValues 集合
* @return 是否成功插入,一条失败,集体失败
*/
public synchronized boolean multiInsert(String tableName, ContentValues[] cv) {
if (cv == null || cv.length == 0) {
return false;
}
SQLiteDatabase db = null;
long id = -1;
try {
db = mOpenHelper.getWritableDatabase();
db.beginTransaction();
for (ContentValues value : cv) {
if (value != null) {
id = db.insert(tableName, null, value);
if (id < 0) {
return false;
}
}
}
db.setTransactionSuccessful();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (db != null) {
db.endTransaction();
// db.close();
}
}
return true;
}
多条数据的插入要比单条数据插入效率高,建议没特别需求选择多条数据插入方法!
4.更新数据
/**
* 更新单条数据
*
* @param tableName 数据库的表名
* @param cv ContentValues
* @param selection 删除数据列名
* @param selectionArgs 删除数据的条件
* @return 成功更新的條數
*/
public synchronized int update(String tableName, ContentValues cv, String selection, String[] selectionArgs) {
if (cv == null || TextUtils.isEmpty(selection)) {
return 0;
}
int result = 0;
SQLiteDatabase db = null;
try {
db = mOpenHelper.getWritableDatabase();
result = db.update(tableName, cv, selection, selectionArgs);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (db != null) {
// db.close();
}
}
return result;
}
ContentValues value = new ContentValues();
value.put(DBCommon.ZTKRecordColumns.COLUMN_ZTK_STATE, bean.status);
update(DBCommon.ZTKRecordColumns.TABLE_NAME_ZTK, value, "name = ?", new String[]{bean.name});
update()方法只能更新某条数据的某个字段值,一次只能更新一个字段值是,如果需要更新多个字段值,可以采取delete该条数据重新insert。