Mak*_*iev 15 sqlite android transactions
从数据库插入,查询,更新和删除项目时,我必须提供同步.据我所知beginTransaction()
,这beginTransactionNonExclusive()
是我需要的方法.
除了SQLite的文档描述EXCLUSIVE
,IMMEDIATE
以及DEFERRED
相当不错.
交易可以是延期交货,即时交易或独家交易.延迟意味着在首次访问数据库之前,不会在数据库上获取锁.
如果事务是立即的,则只要执行BEGIN命令就会在所有数据库上获取RESERVED锁,而无需等待数据库的使用.在BEGIN IMMEDIATE之后,没有其他数据库连接可以写入数据库或执行BEGIN IMMEDIATE或BEGIN EXCLUSIVE.但是,其他进程可以继续从数据库中读取.
独占事务导致在所有数据库上获取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();
}
}
Run Code Online (Sandbox Code Playgroud)
我没有任何问题,没有beginTransaction()
,endTransaction()
和setTransactionSuccessful()
前.我真的需要添加它们吗?
小智 12
当然还有Android!如果您正在为可靠的数据操作工作,那么使用以下支持的方法很重要.
BeginTransaction();
SetTransactionSuccessful();
EndTransaction();
Run Code Online (Sandbox Code Playgroud)
进一步看到这个... 在android中,在使用数据库时使用事务非常重要.
归档时间: |
|
查看次数: |
32679 次 |
最近记录: |