![](/img/trans.png)
[英]How can I ensure data consistency if a setter value must be written into a file?
[英]How can I ensure consistency between multiple model object instances
背景
這是我在開發 Android 應用程序時不斷回到的問題。 假設我的應用允許用戶“關注”電視節目。 我的TVShow
模型類如下:
public class TVShow {
String title;
String[] show_cast;
boolean currently_airing = true;
boolean following = false;
long nextEpisodeTime;
String genre;
}
我有一個存儲數百個電視節目的 SQL 數據庫。 這很有用,因為我可以利用詳細查詢來根據特定信息選擇節目。 我遇到的問題是當我有多個代表同一節目的TVShow
實例時。
例子
假設我的數據庫中有電視節目“行屍走肉”,我從 SQL 查詢創建了一個TVShow
對象。 這個對象實例將被稱為TVShow#1
。 我決定“關注”這個節目,所以我設置了TVShow#1.following = true
。 在我的應用程序的其他地方,我查詢了當前正在播出的節目列表,其中“行屍走肉”是其中的一部分。 將為該列表創建一個名為TVShow#2
的新TVShow
實例。 這里的問題是,我有兩個TVShow
對象, TVShow#1
和TVShow#2
表示“行屍走肉”,但他們卻得到不同的值following
。 這將導致整個應用程序邏輯出現問題,因為表示同一電視節目的所有TVShow
實例之間不存在一致性。
我不好的解決方法
將其擴展為一堆對象實例和更復雜的字段和邏輯,這就是我目前所處的情況。我通過在應用程序啟動時將所有 SQL 數據加載到內存(通常是ArrayList
或HashMap
)來緩解這種情況,並且只查詢這些 Java 對象而不是 SQL 數據庫。 此解決方案效率低下且不方便,而 SQL 查詢確實可以提供幫助。 我希望我的例子不會太混亂。 如果我能澄清或提供更多信息,我很樂意。 請讓我知道是否有更好的方法可以確保同一模型對象的多個實例之間的一致性。
聽起來“跟隨”屬性應該是用戶的財產而不是電視節目。
您的數據庫應記錄用戶之間的關聯以及他們關注的顯示。 因此,如果用戶決定關注節目,則在該用戶與該節目之間保存數據庫中的持久關聯,然后在下次查詢數據庫時,狀態將保持一致。
我用於此問題的解決方案是基於RxJava的,但是可以在沒有Rx的情況下實現。
我們的想法是您“訂閱”數據庫查詢中的數據。 每次寫入數據庫時都會影響查詢觸及的其中一個表,然后重新運行查詢並獲得一組新數據。
這樣,當TVShow1
保存到數據庫時,生成TVShow2
的查詢將重新運行,並且您擁有最新版本的數據。
如果您使用Rx,有兩個庫可以為您完成所有這些:
如果您不使用Rx,那么Realm與其更改適配器具有類似的功能。
最后你可以自己動手。 這將涉及一個單一的注冊查詢的單例,鏈接到他們正在讀取的表。 每次執行寫操作時,都要讓本課程知道哪些表已更改,並重新運行查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.