检查Realm对象是否已存在

时间:2016-07-31 18:34:59

标签: objective-c realm

我的应用中有一个名为Restaurant的Realm对象。此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];

现在,我想要的是,当添加一家餐馆,但它已经存在于该配置中时,它不会被存储。但是当添加相同的餐馆时,但是某些东西是不同的 - 即使它是1个桌子的座位数量 - 它应该被添加。实现这一目标的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

Realm支持名为primary keys的内容,它似乎非常适合您的问题。

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

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

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

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

希望有所帮助。

答案 1 :(得分:0)

解决方案是创建一个散列值的主键。即从合理唯一的数据创建哈希。例如,哈希餐馆名称和表名。

然后你必须拥有每个哈希值的桶,这些哈希值将包含击中它的餐馆。

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

答案 2 :(得分:0)

对此进行更新:添加时,您不再需要具有其他语法。确保存在主键,并且Realm将在更新方面进行其余工作。 Link