【问题标题】:How to know when Room database operations are done?如何知道 Room 数据库操作何时完成?
【发布时间】:2018-11-29 18:38:17
【问题描述】:

我是第一次使用 Room,并注意到在执行操作完成时似乎没有任何回调。这存在吗?如果不是,那么插入或更新数据然后立即检索该数据的最佳做法是什么。我想要一个保证已经做出了改变。我注意到,除非我在检索数据之前有任意延迟,否则我得到的数据是旧数据而不是更新数据。

这是一个 DAO 示例

@Dao
public interface TestDao {

    @Query("SELECT * FROM test_table")
    List<TestEntity> getAll();

    @Query("DELETE FROM test_table")
    void deleteAll();

    @Insert
    void insert(TestEntity testEntities);

    @Delete
    void delete(TestEntity testEntity);

    @Update
    void update(TestEntity testEntity);
}

这是我的应用数据库

@Database(entities = {TestEntity.class}, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {

    private static final String DATABASE_NAME = "room.test.db";
    private static AppDatabase APP_DATABASE_INSTANCE;

    public abstract TestDao testDao();

    public static AppDatabase getAppdatabase(@NonNull Context context) {
        if (FrameworkUtils.checkIfNull(APP_DATABASE_INSTANCE)) {
            APP_DATABASE_INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                    AppDatabase.class, DATABASE_NAME).build();
        }
        return APP_DATABASE_INSTANCE;
    }

    /**
     * Method is used to destroy database instance
     */
    public static void destroy() {
        APP_DATABASE_INSTANCE = null;
    }
}

这是我执行更新的方式

Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                // update database tables
                AppDatabase.getAppdatabase(context).testDao().update(testEntity);

            }
        });

这是我检索数据的方式

Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                // get database data
                List<TestEntity> alData = AppDatabase.getAppdatabase(context).testDao().getAll();

            }
        });

我为此代码创建了函数,这样我就可以调用 update(testEntity) 和 get()。问题是我无法进行背靠背操作

TestEntity testEntity = new TestEntity();
testEntity.fname = "firstName"
testEntity.lname = "lastName"

update(testEntity);
get(); // the data fetched is old data unless I wrap this with a 5 second delay or something

【问题讨论】:

    标签: android sqlite android-room


    【解决方案1】:

    您应该使用LiveData&lt;List&lt;Entity&gt;&gt;(从 Dao 返回)而不是列表本身。这样您就可以观察实时数据并在每次更新基础数据时收到警报

    文档可以在这里找到:https://developer.android.com/topic/libraries/architecture/livedata

    【讨论】:

    • 你有你所说的例子吗?我会接受你的回答,我明白你的意思。对于其他人,这里有一个很好的例子:stackoverflow.com/questions/47215666/…
    • 还有其他方法可以代替 LiveData 吗?
    猜你喜欢
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    相关资源
    最近更新 更多