在插入,查询,更新和删除数据库中的项目时,我必须提供同步。据我所知,beginTransaction()
和beginTransactionNonExclusive()
是我需要的方法。
此外,SQLite documentation相当好地描述了EXCLUSIVE
,IMMEDIATE
和DEFERRED
。
交易可以是延期,即时或独家。延期手段 在数据库第一次之前,不会在数据库上获取锁 访问。
如果事务是立即的,则获取RESERVED锁 一旦执行BEGIN命令,所有数据库都没有 等待使用数据库。在BEGIN IMMEDIATE之后,没有其他 数据库连接将能够写入数据库或做一个 开始立即或开始独家。其他流程可以继续 但是,从数据库中读取。
独占事务导致在所有上获取EXCLUSIVE锁 数据库。在BEGIN EXCLUSIVE之后,没有其他数据库连接 除了read_uncommitted连接将能够读取 没有异常的数据库也没有其他连接就可以了 编写数据库直到事务完成。
当某些线程正在使用数据库时,它似乎提供了一些保护,以防止不必要的插入和查询。但我不确定它是否能保证同步。
我的insert
有ContentProvider
方法。
@Override
public Uri insert(Uri baseUri, ContentValues values) {
try {
mDatabase = mHelper.getWritableDatabase();
mDatabase.beginTransaction(); // EXCLUSIVE
switch (sUriMatcher.match(baseUri)) {
case UriCodes.COUNTRIES:
case UriCodes.CONTINENTS:
case UriCodes.ORGS:
String table = baseUri.getLastPathSegment();
long rowId = mDatabase.insert(table, null, values);
Uri uri = Uri.withAppendedPath(baseUri, Long.toString(rowId));
mDatabase.setTransactionSuccessful();
return uri;
default:
mDatabase.endTransaction();
throw new IllegalArgumentException(UNSUPPORTED_URI + SPACE + baseUri);
}
} finally {
mDatabase.endTransaction();
}
}
之前没有beginTransaction()
,endTransaction()
和setTransactionSuccessful()
我没有遇到任何问题。我真的需要添加它们吗?
答案 0 :(得分:12)
关闭Android课程!如果您正在为可靠的数据操作工作,那么使用以下支持的方法非常重要。
BeginTransaction();
SetTransactionSuccessful();
EndTransaction();
如需进一步了解... In android it is highly important to use transactions when working with databases.
答案 1 :(得分:1)
是的,它使应用程序流畅。因为SQLite将一个游标视为一个事务,所以如果我们在插入大量数据之前使用begin transaction(),那么使用setTransactionSuccessful()第二个,然后在endite中使用endTransaction(),SQLite将此插入事件视为一个事务,而不是数百个事务。