gpt4 book ai didi

android - Room 中的 RunInTransaction 方法

转载 作者:行者123 更新时间:2023-11-29 14:12:26 25 4
gpt4 key购买 nike

我正在尝试弄清楚 RunInTransaction 最终会做什么。 Room 文档除了“在数据库事务中执行指定的 Runnable”之外没有说太多。

据我了解:

如果我们有一个像查询这样的异步操作,然后在没有 runInTransaction 的情况下进行一些插入

roomDB.runInTransaction(new Runnable() {
@Override
public void run() {
query
}
});

insertions
insertions

runInTransaction 锁定数据库,直到指定的操作完成。因此,在第一次插入时,线程会暂停(请纠正我),直到 runInTransaction 完成。

我如何控制先执行哪个过程?

但我认为数据库无论哪种方式都会锁定表并且不使用 runInTransaction 方法。如果我错了,请纠正我。

已更新

 @Dao
public interface RepoDao {

@Query("SELECT * FROM Table")
LiveData<List<Table>> getAll();

@Insert(onConflict = OnConflictStrategy.REPLACE)
void insert(List<Table> table);
}

主要 Activity

repo = ((BasicApp)getApplication()).getRepository();

repo.insertDataFromNetwork();

((BasicApp)getApplication()).getDatabase().repoMethods()
.getAll().observe(this, new Observer<List<Table>>() {
@Override
public void onChanged(@Nullable List<Table> message) {
Log.d("hello");

}
});;

insertDataFromNetwork

mDatabase.runInTransaction(new Runnable() {
@Override
public void run() {

mDatabase.repoMethods().insert(....);
mDatabase.repoMethods().insert(....);
mDatabase.repoMethods().insert(....);
mDatabase.repoMethods().insert(....);
mDatabase.repoMethods().insert(....);

}
}
});

最佳答案

事务表示在数据库管理系统中针对数据库执行的工作单元。 (维基百科)

这意味着,例如,如果您不使用 runInTransaction 方法插入 10 个用户并更新 10 个其他用户,Room 会将每个插入和更新作为单个操作(事务)执行,并将更新正在观察的观察者每次都在用户表上更改。在 runInTransaction 方法中做同样的事情会将所有这些更改作为一个操作(事务)执行,并且只会通知监听器一次。

How can i control which procedure executes first?

只需在单个线程中按顺序运行它们。并且不要在主线程中运行数据库事务。

关于android - Room 中的 RunInTransaction 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50736698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com