16

在从数据库中插入、查询、更新和删除项目时,我必须提供同步。据我了解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();
    }
}

beginTransaction()没有,endTransaction()setTransactionSuccessful()之前我没有任何问题。我真的需要添加它们吗?

4

2 回答 2

12

与Android脱轨!如果您正在为可靠的数据操作而工作,那么使用以下受支持的方法很重要。

BeginTransaction();
SetTransactionSuccessful();
EndTransaction(); 

进一步看这个…<a href="http://www.helloandroid.com/tutorials/database-transactions" rel="noreferrer">在android中使用数据库时使用事务是非常重要的。

于 2013-05-16T04:39:39.913 回答
1

是的,它使应用程序流畅。因为SQLite将一个游标视为一个事务,所以如果我们在插入大量数据之前使用begin transaction(),然后使用setTransactionSuccessful(),最后使用endTransaction(),SQLite会考虑这个将事件作为一个事务插入,而不是数百个事务。

于 2017-04-06T11:34:05.153 回答