在执行自定义 sql 查询 ROOM 时通知观察者
Notify observers when executing a custom sql query ROOM
我一直在努力寻找一种方法,在 Room 数据库中的数据发生变化时通知当前活跃的观察者。我所有的数据都包装在 LiveData 观察者对象中,然后它们有一个观察者附加到他们身上。
这是基础道之一
@Dao
public interface SubcategoryDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertSubcategory(Subcategory... subcategories);
@Query("SELECT * FROM subcategory_table")
LiveData<List<Subcategory>> getAllSubcategories();
@Query("SELECT * FROM subcategory_table WHERE category_id=:catId")
LiveData<List<Subcategory>> getAllSubcategoriesForCategory(int catId);
@Query("SELECT id FROM subcategory_table WHERE title=:title")
LiveData<Integer> getSubcategoryIdByTitle(String title);
@Query("SELECT * FROM subcategory_table WHERE title=:title")
LiveData<Subcategory> getSubcategoryByTitle(String title);
}
我从服务器收到 SQL 字符串查询,然后根据文档执行它们的唯一方法是:
AppDatabase.getInstance(activity)
.getOpenHelper()
.getWritableDatabase()
.execSQL(sqlQuery);
那么如何让它与观察者一起工作呢?我如何通知他们或使他们无效以重新加载 ui?
您需要将 refreshVersionsAsync()
用于 Room 的 InvalidationTracker
。
这实质上是检查是否有任何 table 已更改,并通知有关任何更改的回调 - 使实时数据能够在您的 UI.
中刷新
确保您使用 execSQL
执行的 SQL 查询不会重新创建 table,因为当 table 重新创建时跟踪概念会丢失被毁。如果您需要重新创建 tables,请使用 clearAllTables()
擦除任何数据——但重要的是不要擦除 table 本身——然后使用 SQL 查询重新插入记录。
Enqueues a task to refresh the list of updated tables. This method is automatically called when RoomDatabase.endTransaction() is called but if you have another connection to the database or directly use SupportSQLiteDatabase, you may need to call this manually.
我一直在努力寻找一种方法,在 Room 数据库中的数据发生变化时通知当前活跃的观察者。我所有的数据都包装在 LiveData 观察者对象中,然后它们有一个观察者附加到他们身上。
这是基础道之一
@Dao
public interface SubcategoryDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertSubcategory(Subcategory... subcategories);
@Query("SELECT * FROM subcategory_table")
LiveData<List<Subcategory>> getAllSubcategories();
@Query("SELECT * FROM subcategory_table WHERE category_id=:catId")
LiveData<List<Subcategory>> getAllSubcategoriesForCategory(int catId);
@Query("SELECT id FROM subcategory_table WHERE title=:title")
LiveData<Integer> getSubcategoryIdByTitle(String title);
@Query("SELECT * FROM subcategory_table WHERE title=:title")
LiveData<Subcategory> getSubcategoryByTitle(String title);
}
我从服务器收到 SQL 字符串查询,然后根据文档执行它们的唯一方法是:
AppDatabase.getInstance(activity)
.getOpenHelper()
.getWritableDatabase()
.execSQL(sqlQuery);
那么如何让它与观察者一起工作呢?我如何通知他们或使他们无效以重新加载 ui?
您需要将 refreshVersionsAsync()
用于 Room 的 InvalidationTracker
。
这实质上是检查是否有任何 table 已更改,并通知有关任何更改的回调 - 使实时数据能够在您的 UI.
中刷新确保您使用 execSQL
执行的 SQL 查询不会重新创建 table,因为当 table 重新创建时跟踪概念会丢失被毁。如果您需要重新创建 tables,请使用 clearAllTables()
擦除任何数据——但重要的是不要擦除 table 本身——然后使用 SQL 查询重新插入记录。
Enqueues a task to refresh the list of updated tables. This method is automatically called when RoomDatabase.endTransaction() is called but if you have another connection to the database or directly use SupportSQLiteDatabase, you may need to call this manually.