Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android beginTransaction()、endTransaction()和setTransactionSuccessful()。他们到底做什么?_Android_Sqlite_Transactions - Fatal编程技术网

Android beginTransaction()、endTransaction()和setTransactionSuccessful()。他们到底做什么?

Android beginTransaction()、endTransaction()和setTransactionSuccessful()。他们到底做什么?,android,sqlite,transactions,Android,Sqlite,Transactions,我必须在插入、查询、更新和删除数据库中的项目时提供同步。据我所知,beginTransaction()和beginTransactionNoneExclusive()是我需要的方法 此外,还很好地描述了独占、立即和延迟 事务可以是延迟的、即时的或独占的。递延手段 在第一次访问数据库之前,不会获取数据库上的锁 访问 如果事务是即时的,则在上获取保留锁 一旦执行BEGIN命令,所有数据库都将立即恢复,而不带 正在等待使用数据库。在一段时间后立即开始,没有其他 数据库连接将能够写入数据库或执行 立即开

我必须在插入、查询、更新和删除数据库中的项目时提供同步。据我所知,
beginTransaction()
beginTransactionNoneExclusive()
是我需要的方法

此外,还很好地描述了
独占
立即
延迟

事务可以是延迟的、即时的或独占的。递延手段 在第一次访问数据库之前,不会获取数据库上的锁 访问

如果事务是即时的,则在上获取保留锁 一旦执行BEGIN命令,所有数据库都将立即恢复,而不带 正在等待使用数据库。在一段时间后立即开始,没有其他 数据库连接将能够写入数据库或执行 立即开始或独占开始。其他进程可以继续进行 但是,从数据库中读取

独占事务导致在所有服务器上获取独占锁 数据库。在开始独占后,没有其他数据库连接 除read_外,未提交的连接将能够读取 数据库和任何其他连接都无法正常运行 写入数据库,直到事务完成

在某些线程处理数据库时,它似乎提供了一些保护,防止不必要的插入和查询。但我不确定它是否能保证同步

有我的
ContentProvider
insert
方法

@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()
的问题。我真的需要添加它们吗?

不适用于Android!如果您正在进行可靠的数据操作,那么使用以下支持的方法是很重要的

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

进一步查看此,

是的,它使应用程序平滑。因为SQLite将一个游标视为一个事务,所以如果在插入大量数据之前使用开始事务(),然后使用StTurTraceOnExcRealFor(),然后EngTimeActuffon(),SQLite将将此插入事件视为一个事务,而不是成百上千的交易。

我想知道为什么Android文档没有提到这一点。。。