【问题标题】:Is there a way to pre-package Realm database (default.Realm) through React-Native (JS)有没有办法通过 React-Native (JS) 预打包 Realm 数据库(default.Realm)
【发布时间】:2016-04-17 22:31:30
【问题描述】:

我玩过 Realm,让它与 React-Native 一起工作 - 从 JSON 文件中插入数据,并能够过滤/读取它。

现在真正的问题是,如何使用我的 react-native 应用程序预先打包数据。我看到了一些问题,其中提到了如何使用 Native (IOS) 和(Android)

我想检查是否有直接使用 React-Native 的方法,可能是某人创建的桥梁?

谢谢!

【问题讨论】:

    标签: javascript android swift react-native realm


    【解决方案1】:

    理想情况下,您可以在打开领域时只使用捆绑领域文件的路径。不幸的是,在添加对只读领域的支持之前,这将不起作用。我创建了一个问题来跟踪它:https://github.com/realm/realm-js/issues/392

    在支持只读领域之前,您可以在 AppDelegate 中的应用启动时将捆绑的领域文件复制到 Documents 目录中,然后使用该路径访问捆绑的领域。支持相对路径,因此如果您将文件复制到<Documents>/bundled.realm,您只需传入文件名即可打开此文件,即new Realm({path: 'bundled.realm'})

    【讨论】:

    • 嗨@Ari - 所以我尝试了上述方法,我捆绑了一个预加载的领域文件。它运作良好。我还编写了 Objective C 代码以将 default.realm 文件添加到 Documents。现在,问题是,当我尝试进行任何更新时。我从 React-Native 得到一个例外。请注意,我必须在我的 xcode 中为 IOS 添加 React.Framework 才能导入 import <Realm/Realm.h> - 这是罪魁祸首,当我删除它时,一切正常。如果您有任何方向或需要更多详细信息,请告诉我。
    • @Abhay 你看到了什么异常?如果您在 React Native 中使用的架构与您的 Objective C 架构完全不同,那么您将在 Realm 初始化期间遇到异常。如果在 JS 中打开 Realm 时没有传递 schema 参数,它应该只使用 Objective C 中使用的 schema,这可以避免这个问题,尽管这还没有经过彻底的测试。
    • 感谢您的回复。我正在使用与 schemaVersion: 1 相同的 default.realm 文件...所以文件没有变化。该文件被复制......我也能够读取数据......我遇到了一个问题,它无法写入数据库。这是我在 AppDelegate.m 中的要点 - gist.github.com/abhaytalreja/69e16e8a2384123a4257483fa55fb14c
    • (这可能是一个不同的问题)在并行说明中,我还尝试使用异步进程创建数据 - github.com/corbt/next-frame 并在保存第一项后,我收到一个错误.错误显示 "http://localhost:8082/commit_transaction net::ERR_CONTENT_LENGTH_MISMATCH" - 这就是我在浏览器中看到的全部内容,我不知道 Objective C,但控制台显示的是 "libc++abi.dylib: terminating with uncaught exception of type std::__1::system_error: mutex lock failed: Invalid argument"
    • 当您删除 Realm 文件时,仅删除 .realm 文件的路径是不够的。还有一个锁定文件需要删除,日志文件也应该删除。这些文件位于文件系统中的 Realm 文件旁边。您的问题可能是由于遗留了锁定文件。有人要求添加一种方法,以便更轻松地删除所有这些文件,这些文件应该会在下一个版本中使用。在此之前,您还可以尝试调用Realm.clearTestState();,它会关闭所有打开的领域并删除文档目录中的所有领域文件。
    【解决方案2】:

    我们创建了一个实用方法来访问

    • 来自 android 的 assets 文件夹。
    • 来自 iOS 的资源。

    export function readOnetContent() {
        let mainbundelPath = RNFS.MainBundlePath + "/oNetContent.realm"
        if (Platform.OS == "android") {
            Realm.copyBundledRealmFiles();
            mainbundelPath = "oNetContent.realm"
        }
    
        return new Promise((resolve, rejects) => {
            Realm.open({
                 schema: Schema,
                 path: mainbundelPath,
                 readOnly: true})
                .then(realm => {
                    let oNetContent = realm.objects(OnetContentSchema.name)
                    resolve(oNetContent)
                })
                .catch(error => {
                    console.log("error: ", error)
                    rejects(error)
                })
        })
    }
    • IOS 的目录结构是:

    • Android 的目录结构是:

    【讨论】:

      猜你喜欢
      • 2020-03-24
      • 1970-01-01
      • 1970-01-01
      • 2017-02-18
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      • 1970-01-01
      • 2019-12-31
      相关资源
      最近更新 更多