React Native Expo离线应用程序:如何从远程服务器更新本地数据库

时间:2019-08-22 16:48:00

标签: reactjs react-native expo react-native-ios offline-caching

我正计划构建一个新的脱机优先的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。

1 个答案:

答案 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