我正计划构建一个新的脱机优先的React Native Expo应用程序,该用户主要将浏览图像和文本内容。
它必须是完全托管的Expo应用程序,不能弹出。所以 Realm DB不是解决方案,因为它需要弹出Expo应用程序
有时,用户将能够手动触发数据库(图像和JSON文件)的重新加载。这将下载整个数据库(〜50-100MB)或差异更新(我尚不知道这种实现方式)。
database.json的示例
{
"dbVersion": "1.0.1",
"data": {
"animals": [
{
"name": "Dog",
"age": 5,
"quantity": 609,
"images": ["./assets/images/animals/dog/01.jpg", "./assets/images/animals/dog/02.jpg"]
},
{
"name": "Cat",
"age": 2,
"quantity": 66,
"images": ["./assets/images/animals/cat/01.jpg", "./assets/images/animals/cat/02.jpg"]
}
],
"food": [
{
"name": "Banana",
"color": "Yellow",
"quantity": 200,
"images": ["./assets/images/food/banana/01.jpg", "./assets/images/food/banana/02.jpg"]
}
]
}
}
问题:您将如何为此类应用程序实现数据库(JSON文件和图像文件)的下载?在带有Expo的React Native中有这样的实现最佳实践吗?
我当前的想法:是否可以将所有数据库文件(JSON和图像)打包到托管在远程服务器(例如Amazon S3)上的.zip
文件中,该应用程序将将此单个文件下载到其本地文件存储中,删除与现有数据库关联的所有文件,然后将新下载的.zip
文件解压缩到其位置?
Expo随附SQLite support。也许如果图像也存储在SQLite中,Expo可以(以某种方式不确定)如何从远程服务器上下载新的SQLite db.db
,并覆盖db.db
的现有本地副本?
还是我们必须滚动我们自己的转换器,该转换器从远程服务器获取下载的数据库,然后将它们转换为SQL语句,SQLite将执行该语句以导入下载的数据。
当前使用Expo SDK 32,React Native 0.59.8。
答案 0 :(得分:1)
如果您想要简单的方法,请使用AsyncStorage
//save data
const data = JSON.stringify(yourJson);
AsyncStorage.setItem("@database", data);
//load data
AsyncStorage.getItem("@database").then(dataString => {
const data = JSON.parse(dataString);
})
或使用本地数据库(https://github.com/realm/realm-js)