https://www.cnblogs.com/senior-engineer/p/7112606.html?utm_source=itdadao&utm_medium=referral
制】多线程操作写入数据库时,需要使用事务,以免出现同步问题。
说明:
通过 SQLiteOpenHelper 获取数据库 SQLiteDatabase 实例,Helper 中会自动缓存
阿里巴巴 Android 开发手册
- 41 -
已经打开的 SQLiteDatabase 实例,单个 App 中应使用 SQLiteOpenHelper 的单例
模式确保数据库连接唯一。由于 SQLite 自身是数据库级锁,单个数据库操作是保证
线程安全的(不能同时写入) ,transaction 是一次原子操作,因此处于事务中的操作
是线程安全的。
若同时打开多个数据库连接,并通过多线程写入数据库,会导致数据库异常,提示
数据库已被锁住。
正例:
public void insertUserPhoto(SQLiteDatabase db, String userId, String content) {
ContentValues cv = new ContentValues();
cv.put("userId", userId);
cv.put("content", content);
db.beginTransaction();
try {
db.insert(TUserPhoto, null, cv);
// 其他操作
db.setTransactionSuccessful();
} catch (Exception e) {
// TODO
} finally {
db.endTransaction();
}
}
推荐】大数据写入数据库时,请使用事务或其他能够提高 I/O 效率的机制,保证执
行速度。
正例:
public void insertBulk(SQLiteDatabase db, ArrayList<UserInfo> users) {
db.beginTransaction();
try {
for (int i = 0; i < users.size; i++) {
ContentValues cv = new ContentValues();
cv.put("userId", users[i].userId);
cv.put("content", users[i].content);
db.insert(TUserPhoto, null, cv);
}
// 其他操作
db.setTransactionSuccessful();
} catch (Exception e) {
// TODO
} finally {
db.endTransaction();
}
}