【问题标题】:Check if Realm object already exists检查 Realm 对象是否已经存在
【发布时间】:2016-07-31 18:34:58
【问题描述】:

我的应用中有一个名为Restaurant的领域对象。这个Restaurant 对象有很多Table 对象连接到它。如果我保存,它看起来像这样:

Restaurant *restaurant = [[Restaurant alloc] init];
restaurant.url = [_userData url];
restaurant.type = [_userData kind];

for (int i = 0; i < [[_userData tables] count]; i++) {
    Input  *input = [[_userData tables] objectAtIndex:i];
    Table *table = [[Table alloc] init];

    table.title = input.title;
    table.seats = input.seats;
    table.type = input.type;

    [restaurant.tables addObject:table];
}

RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
config.fileURL = [NSURL URLWithString:[Preferences getRealmPath]];
RLMRealm *realm = [RLMRealm realmWithConfiguration:config error:nil];

[realm beginWriteTransaction];
[realm addObject:restaurant];
[realm commitWriteTransaction];

现在,我想要的是,当添加餐厅但它已经存在于该配置中时,它不会被存储。但是,如果添加了同一家餐厅,但 something 不同 - 即使是 1 张桌子的座位数量 - 也应该添加。实现这一目标的最佳方法是什么?

【问题讨论】:

    标签: objective-c realm


    【解决方案1】:

    Realm 支持名为 primary keys 的东西,这似乎很适合您的问题。

    主键是 Realm 对象的唯一标识符;它可以是整数或字符串。在您的情况下,您可以使用 URL 作为主键(如果每个餐厅确实只与一个 URL 相关联),或者添加一个新属性作为主键(可能是 name 字段)。

    然后您可以使用addOrUpdateObject: 方法代替addObject: 方法。此方法仅适用于具有主键的对象类型。

    在您的情况下,假设您为 Restaurant 模型类型设置了主键,Realm 将执行以下操作之一:

    • 如果 Restaurant 之前已添加到领域,并且相对于您的新模型没有更改,则不会发生任何变化。
    • 如果 Restaurant 之前已添加到领域,但您的模型已更改,则领域中的现有模型将更新。
    • 如果Restaurant 之前没有添加到领域,它将被添加。

    希望对您有所帮助。

    【讨论】:

    • 嗯,我知道主键,我考虑过它们。 但是,用户可以输入数据,因此可能存在多个餐厅实例,其中只有一张桌子发生了变化。所有这些都应该被存储。当它是完整的 1 对 1 匹配时,不应存储它。
    • 在这种情况下,您可能希望在您的领域中为所有Restaurants 使用query,这些Restaurants 具有您要添加的新Restaurant 作为新的Restaurant。如果该查询的Results 为空,则只需添加新模型即可。否则,您可以遍历每个结果中的 Tables 并检查是否相等(您可能希望在该类上覆盖 isEqual:);如果没有一个结果与您的模型具有相同的表,您知道您可以添加它。
    • 这非常耗费资源,不是吗。我真的很想知道是否有更好的方法。
    • 恐怕不行,抱歉。 Realm 是为我上面概述的主键用例而设计的,而不是用于基于相等性检查和过滤模型。
    【解决方案2】:

    对此进行更新:添加时不再需要使用不同的语法。确保存在主键,Realm 将完成其余的更新工作。 Link

    【讨论】:

      【解决方案3】:

      一种解决方案是创建一个散列值的主键。即从具有合理唯一性的数据中创建散列。例如,散列餐厅名称和餐桌名称。

      然后你必须为每个哈希值创建一个桶,其中包含命中它的餐厅。

      如果新进入的餐厅没有现有的哈希,可以简单地添加到桶中,否则需要检查它是否与桶中现有的餐厅匹配以测试唯一性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-11
        • 1970-01-01
        • 2012-09-26
        • 2017-02-24
        • 1970-01-01
        • 2010-12-21
        • 1970-01-01
        • 2012-05-13
        相关资源
        最近更新 更多