2015-12-21 34 views
2

當我的應用程序啓動並且逼真時,它會拉出一些json數據,一旦數據被拉出,我真的不需要在用戶體驗期間再次拉動它。後端數據最多可能每天更新幾次,所以我想我只需在應用程序啓動時獲取數據,然後在該持續時間內使用相同的數據,併爲用戶提供手動刷新數據的選項。所以,我的問題是,我應該在哪裏/如何存儲這些數據?我已經建立了所有的數據結構(類和子類)。有些類可能有200個左右的例子。如果我將所有內容都作爲成員變量存儲在我的activity_main類中,則一旦其他活動啓動,它就不能用於其他活動。將它們全部存儲在數據庫中可能是一種選擇,但它有點過度。我真的不需要數據在會話之間持續。有沒有一種方法可以輕鬆地將其存儲在內存中,並且仍然可以輕鬆訪問所有活動?Android在哪裏存儲緩存的數據?

+0

您應該考慮到您的用戶可以將應用程序置於後臺,打開Chrome瀏覽器,播放視頻,回到您的應用程序,並且您下載的所有數據都將因進程死亡而丟失,您必須下載他們再次。 – EpicPandaForce

回答

2

您應該考慮操作系統在內存不足的情況下終止您的應用進程,因此將數據備份到磁盤上是一件好事。這樣做,您可以從磁盤緩存中顯示用戶數據,同時在服務器的後臺刷新它。

選擇數據存儲工具取決於您需要使用數據的方式。

當然,還有就是用Realm一種選擇,但你應該考慮的是,它是關係數據庫。因此,如果您的業務邏輯具有複雜的連接域和其他關係類型的域模型,我會選擇其他類型的域。它是線程安全的,也有遷移(但是,對我而言,遷移總是很痛苦,你不能做任何關於它的事情)。領域現在應該是RxJava友好的(支持在v0.87中添加)有一些disadvantages(其中一部分可能已經被修復),但在使用前應該考慮它。

至於多個關係的方法,有SQLBrite庫:

周圍SQLiteOpenHelper甲輕量級封裝其引入反應性流語義來SQL操作。

它不是一個ORM(但如果你願意,你可以在SQLBrite上添加某種吧:see this獲取更多信息)。事實上,這個庫本身就是在做一件事情(並且做得很好) - 它提供了一種協調和組織表更新通知的機制(Realm也有這樣的能力),這樣你就可以更新查詢(採用SQL方式)只要數據發生變化。它尊重RxJava! 作爲SQLBrite的替代品,您可以查看StorIO

也有很多不同的ORM解決方案,如GreenDAO,ORMLite等

但我敢肯定,前兩個庫(領域或SQLBrite)可能會幫你的一個。因此,分析你的應用程序,這些庫,並決定什麼更適合。

P.S. Great article關於RxJava如何幫助您輕鬆處理來自不同數據源(內存緩存+磁盤緩存+網絡)的數據。可能有幫助!

1

我仍然會推薦一個SQLite數據庫,你可以很容易地將它聲明爲'內存中'的數據庫,如果這是你想要的。

但是....如果它一遍又一遍地下載冗餘數據,我會比較不滿意你的應用程序的用戶。我只是建議製作一個內容提供商並完成它。這使您可以訪問SyncAdapter,並在代碼的去向之間定義明確的邊界。

製作一個好的ContentProvider的'技巧'是製作出好的POJO,它具有從POJO - > ContentValues和Cursor - > POJO(s)轉換的方法。

1

最簡單的事情就是將json文件存儲在Apps數據存儲中,並在每次需要時解析json。

但是,這是不建議,因爲它是每次解析數據昂貴。

最好的選擇是要實現Realm(替換Sqlite),這是很容易實現,它的速度驚人。