【问题标题】:Realm.open vs new RealmRealm.open 与新领域
【发布时间】:2025-12-26 13:25:16
【问题描述】:

在 React Native 应用程序的上下文中,仅在本地使用 Realm(因此目前没有领域对象服务器)。使用打开领域有什么区别 Realm.open({schema: [Car, Person]}) 并使用 new Realm({schema: [Car, Person]}); 创建一个新的 Realm 实例我什么时候应该使用其中一个?

看起来Realm.open 只是一个回调以确保同步完成,所以只需要同步的领域?

到目前为止,这是我发现的:

Realm.open:

根据doc referenceRealm.open的意思是“用一个promise异步打开一个Realm。如果Realm是同步的,它将在可用之前完全同步。”js docs

新领域:

根据doc reference 中的构造函数,new Realm创建一个新的 Realm 实例 [...]。如果 Realm 尚不存在 [...],则此构造函数将创建它。否则,实例将访问现有的 Realm

在 React 示例中,他们使用新的:https://github.com/realm/realm-js/blob/master/examples/ReactExample/components/realm.js

【问题讨论】:

    标签: javascript react-native realm


    【解决方案1】:

    您有任何特定的用例吗?否则,在本机反应中,到目前为止我还没有使用 Realm.open。 他们的方式我见过大多数人接近架构是有一个名为的文件 领域.js 定义模式并像这样导出新领域

    class ShoppingCartItem extends Realm.Object{}
    ShoppingCartItem.schema = {
        name: 'ShoppingCartItem',
        primaryKey: 'ordernumber',
        properties: {
            ordernumber: 'string',
            quantity: 'int',
            unitPrice: 'double'
        }
    }
    
    export default new Realm({schema: [User, LastViewedProduct, ShoppingCartItem]});
    

    然后有另一个名为 realmTasks.js 的文件,您可以在其中导入该领域对象并在其上定义操作。如果您需要本地状态的领域对象来注册更改,您可以定义一个回调并将领域引用作为参数提供给它,例如

    export function addShoppingCartItem(ordernumber, quantity, unitPrice, callback){
        realm.write(() => {
            realm.create('ShoppingCartItem', {
                ordernumber: ordernumber,
                quantity: quantity,
                unitPrice: unitPrice
            });
        })
        return callback(realm);
    }
    

    我不确定这是否完全回答了您的问题或对您是否有用,但我希望这能给您一个提示:)

    【讨论】:

    • 我也在使用你提到的“新领域”,也像github.com/realm/realm-js/blob/master/examples/ReactExample/… 在我使用 Realm.open 之前,但我开始在 Android 上看到一些 "Object Type xxx is not found in schema" 问题,这就是我改变的原因.
    • @XaviA。根据您提供的链接和上面的答案,我正在使用new Realm,但是我想使用其中一种异步打开方法。您能否提供代码说明您如何在 React Native 应用程序中使用 .open 并能够从所有屏幕访问该领域?
    • 在我的情况下,我使用“新领域”方法没有问题。 “我想使用其中一种异步打开方法”是什么意思?我在这里用“新领域方法”的更多代码更新了我的答案:*.com/questions/46566527/… 可能用export default Realm.open({schema: schemasArray}); 替换export default new Realm({schema: schemasArray}); 可行,但我还没有测试过。
    【解决方案2】:

    docs的回答可以完全覆盖你的问题。 因此,使用同步方法 (const realm = new Realm()) 更简单,也更适合将领域作为模块导出,但在架构迁移和远程同步时,最好获得承诺 Realm.open() 并处理领域实例 服务器已完成。

    【讨论】: