2017-06-05 33 views
31

我在React Native世界還是一個新手,並且通常在移動/本機世界也是如此,在數據持久性方面,我發現文檔有點欠缺。使用React Native時,我有什麼選擇來存儲數據? (iOS和Android)

我在React Native中存儲數據的方式有哪些,以及每種類型的含義?舉例來說,我看到有本地存儲和異步存儲,但後來我也看到這樣境界的東西,我很困惑這一切是如何將與外部數據庫。

我特別想知道:

  • 什麼是數據持久化不同的選項?
  • 對於每個,什麼是持久性的限制(即,當爲數據不再可用)?例如:關閉應用程序,重新啓動手機等。
  • 對於每一種,iOS和Android之間的差異(除了一般設置)還是Android?
  • 怎樣的選項進行比較,用於訪問數據離線? (或如何離線訪問通常如何處理?)
  • 是否還有其他方面的考慮,我應該記住?

感謝您的幫助!

+0

如果你想存儲敏感數據,你可以看看這個:https://stackoverflow.com/questions/45547657/what-is-the-best-way-to-store-private-data-in -react-native –

回答

42

下面是我學到的知識,因爲我確定了與當前幾個應用程序項目一起前進的最佳方式。

異步存儲(「內置」反應母語)

我用AsyncStorage一個在生產應用。存儲位於設備本地,未加密(如另一個答案中提到的),如果刪除應用程序則會消失,但應作爲設備備份的一部分保存並在升級過程中保留(本機升級ala TestFlight和通過CodePush升級代碼)。

結論:本地存儲;您提供自己的同步/備份解決方案。

SQLite的

其他項目我已經用過的sqlite3的應用程序存儲工作。這爲您提供了一種類似於SQL的體驗,可壓縮的數據庫也可以在設備之間傳輸。我還沒有將它們同步到後端的經驗,但我想有各種各樣的庫存在。有用於連接到SQLite的RN庫。

數據以傳統數據庫格式存儲,數據庫,表格,鍵,索引等全部以二進制格式保存到磁盤。可以通過命令行或具有SQLite驅動程序的應用程序直接訪問數據。

結論:本地存儲;您提供同步和備份。

火力地堡

火力地堡計劃書,除其他事項外,有一個JSON文檔存儲(如MongoDB中)一起實時NoSQL數據庫意味着保持1到同步客戶端的n個。該文檔討論脫機持久性,但僅限於本機代碼(Swift/Obj-C,Java)。 Google自己的JavaScript選項(「Web」)由React Native使用,不提供緩存存儲選項(請參閱下面的2/18更新)。該庫的編寫假定網絡瀏覽器即將連接,因此將存在半持久連接。您可能可以編寫本地緩存機制來補充Firebase存儲調用,也可以在本機庫和React Native之間編寫橋接。

[Update 2/2018]我自此發現React Native Firebase,它爲本機iOS和Android庫提供兼容的JavaScript接口(做Google可能應該做的事情),爲您提供本地庫的所有優點React Native支持的獎金。隨着Google在實時數據庫旁引入JSON文檔存儲,我將爲Firebase再次尋找我計劃構建的一些實時應用程序。

實時數據庫存儲爲類似JSON的樹,您可以在網站上進行編輯並導入/導出非常簡單。

結論:通過react-native-firebase,RN獲得與Swift和Java相同的優勢。 [/ update]適合聯網設備。低利用率的低成本。與其他Google雲產品很好地結合在一起。數據隨時可見並可從其界面進行編輯。

境界

另外一個實時對象存儲與自動的網絡同步。他們吹噓自己是「設備第一」的演示視頻顯示設備如何處理零星的或有損網絡連接。

他們提供你自己的服務器上或在類似AWS或者Azure的雲解決方案託管對象存儲的免費版本。您還可以創建在內存中存儲了不與設備,僅設備存儲了不與服務器同步上漲持續下去,只讀服務器存儲,並通過一個或多個設備同步的完全讀寫選項。他們擁有專業和企業選項,比Firebase每月的前期花費更多。

與火力地堡,所有領域能力支持原生的反應和Xamarin,就像它們在斯威夫特/ ObjC /爪哇(本機)應用程序。

你的數據被拴在你的代碼的對象。因爲它們是定義的對象,所以你確實有一個模式,並且版本控制對於代碼的完整性來說是必須的。通過Realm提供的GUI工具可以訪問直接訪問。設備上的數據文件是跨平臺兼容的。

結論:設備先用免費和付費計劃可選的同步。 React Native支持所有功能。水平縮放比Firebase更昂貴。

的iCloud

老實說,我沒有做了很多與此一打,但在不久的將來會做如此。

如果你有一個使用CloudKit本機應用程序,你可以使用CloudKit JS從一個Web應用程序連接到您的應用程序的容器(或者,在我們的情況下,作出反應母語)。在這種情況下,您可能會擁有原生iOS應用和React Native Android應用。

像境界,這在本地存儲數據,並同步到iCloud可能的情況下。有爲您的應用程序和每個客戶的私人商店公共商店。客戶甚至可以選擇與其他用戶共享一些商店或對象。

我不知道它是多麼容易訪問原始數據;這些模式可以在Apple的網站上設置。

結論:大蘋果,有針對性的應用程序。

Couchbase

大牌,很多背後的大公司。有一個社區版和企業版與標準的支持成本。

他們已經有了一個教程在其網站上的掛鉤東西反應本土。我也沒有花太多時間在這個上,但它在功能方面似乎是Realm的一個可行的替代方案。我不知道在您的應用程序或您構建的任何API之外獲取數據是多麼容易。

[編輯:研究發現,談論Couchbase和CouchDB的一個較舊的鏈接,CouchDB的可能是又一個值得考慮的選擇。這兩者歷史上相關但目前完全不同的產品。見this comparison]

結論:看起來有類似的功能,境界。可以是僅限設備或同步。我需要嘗試一下。

MongoDB的

我使用這個服務器端的一塊使用AsyncStorage本地應用程序。我喜歡將所有東西都存儲爲JSON對象,使得傳輸到客戶端設備非常簡單。在我的使用案例中,它用作電視指南數據的上游提供商與我的客戶端設備之間的緩存。

對於數據沒有硬架構,就像架構一樣,所以每個對象都被存儲爲一個容易搜索,可過濾等的「文檔」。類似的JSON對象可以有額外的(但不同的)屬性或子對象,爲您構建對象/數據提供了很大的靈活性。

我還沒有嘗試過任何客戶端到服務器的同步功能,我也沒有使用它嵌入。 React本地代碼MongoDB確實存在。

結論:本地只有NoSQL解決方案,沒有像Realm或Firebase這樣明顯的同步選項。


[編輯]我花了一些時間與境界,因爲我最初寫這個。我喜歡我不需要編寫API來同步應用程序和服務器之間的數據,類似於Firebase。無服務器功能也看起來對這兩者非常有用,限制了我必須編寫的後端代碼的數量。

我喜歡MongoDB數據存儲的靈活性,因此這正成爲我對基於Web和其他需要連接的應用程序的服務器端的選擇。

我發現RESTHeart,它創建了一個非常簡單的,可擴展的RESTful API到MongoDB。構建一個讀取JSON對象並將其寫入RESTHeart的React(Native)組件應該不會太困難,而RESTHeart會依次將這些對象傳遞給MongoDB。


[編輯]我添加了有關數據如何存儲的信息。在開發和測試過程中,如果您需要調整和測試數據,有時候瞭解您可能需要做多少工作非常重要。

+0

真的有用的名單,謝謝。也許pouchdb值得一提嗎? – chmac

+0

那麼Redux呢? –

+1

@LeonardoDaCodinchi Redux將有助於狀態管理,但不提供持久存儲功能。 – walshie4

0

我要發佈我從其他人那裏收集的內容,但不會接受這個答案,因爲我知道你們中的一些人會更好地解釋這一點。此外,並非所有我的回答可能是完全準確的,那麼則可以選擇讓我知道在評論,我會更新這個答案。

僅設備存儲

選項:

  • AsyncStorage(終極版 - 堅持在本地使用AsyncStorage除非你指定一個自定義存儲引擎)
  • 境界
  • 火力地堡(或者是這兩個設備和外部?)

注意事項:

  • 關閉應用程序或重新啓動設備後,數據仍然保存。每當應用從設備中刪除
  • 數據核爆(所有選項或只是AsyncStorage和iOS?怎麼樣的iCloud和類似Android的考慮?)

跨設備的存儲

這通常與一個外部DB(和用戶帳戶)來完成,和所述設備保留的數據被水合,並與外部DB數據sync'ed。 (這裏需要更好的信息)

+1

根據我在週末閱讀的Realm v。Firebase文章,以及僅僅在我的手機上進行的簡單測試,Firebase不會對緩存數據執行查詢(該應用程序試圖加載播放列表)。它需要一個網絡連接才能發揮作用,因此我會將其從「僅限設備」存儲中作爲選項取消。 –

+1

此外,Realm可以託管在外部服務器上,他們吹捧實時協作作爲他們的賣點,所以我把它作爲「跨設備」存儲。您也可以搜索JavaScript移動數據庫。我剛剛發現SQLite對React Native的支持:https://github.com/andpor/react-native-sqlite-storage –

+0

我打算在幾天內給出這個問題,看看有沒有人回答得到賞金。如果他們不這樣做,我會用你的觀點以及我得到的任何其他信息更新我的答案。我想給人們一個獎賞的機會(無論如何我都無法贏得)。非常感謝這個信息! – Sia

11

快速和骯髒的:只使用Redux + react-redux + redux-persist + AsyncStorage的反應母語。

它幾乎完美地適應了原生世界,並且像android和ios的魅力一樣工作。此外,它周圍還有一個堅實的社區,還有大量的信息。

有關工作示例,請參閱Facebook上的F8App

數據持久性的不同選項有哪些?

由於反應原生,您可能想要使用redux和redux-persist。它可以使用多個存儲引擎。 AsyncStorage和redux-persist-filesystem-storage是RN的選項。

還有其他選項,如Firebase或Realm,但我從未在RN項目中使用過這些選項。

對於每個持久性(即數據何時不再可用)有何限制?例如:關閉應用程序,重新啓動電話等。

使用redux + redux-persist可以定義什麼是持久的,哪些不是。當沒有持續存在時,數據在應用程序運行時存在。當持續存在時,數據在應用程序執行(關閉,打開,重新啓動手機等)之間持續存在。

AsyncStorage在Android上的默認限制爲6MB。可以配置較大的限制(Java代碼)或使用redux-persist-filesystem-storage作爲Android的存儲引擎。

對於每一個,在iOS和Android之間的實現之間是否存在差異(除了一般設置)?

使用redux + redux-persist + AsyncStorage,在Android和iOS上的設置完全相同。

這些選項如何與離線訪問數據相比較? (或如何離線訪問通常如何處理?)

使用終極版,offiline訪問幾乎是自動的得益於其設計部分(行動創造者和減速器)。

的所有數據,你獲取並存儲可用,您可以輕鬆地存儲額外的數據,以指示狀態(取,成功,錯誤),這是牽強的時間。通常情況下,請求進行提取並不能否定在接收新數據舊數據和你的組件只需更新。

同樣適用於其他方向。您可以存儲要發送給服務器的數據,這些數據仍處於待處理狀態,並據此進行處理。

是否還有其他方面的考慮,我應該記住?

React提倡創建應用程序的被動方式,而且Redux非常適合它。只是用你會在你的常規Android或iOS應用使用的選項之前,您應該嘗試一下。此外,你會發現更多的文檔和幫助。上述

+2

感謝您深入瞭解AsyncStorage/Redux Persist。我更多地瞭解所有選項的概述,所以這是我沒有選擇這個作爲官方答案的唯一原因。 – Sia

1

鄉親擊中右筆記存儲,但如果你還需要考慮的是需要存儲任何數據PII那麼你也可以藏進使用類似https://github.com/oblador/react-native-keychain因爲ASyncStorage是未加密的鑰匙串。它可以作爲持久化配置的一部分應用於像redux-persist之類的東西。

相關問題