我的应用中有一个名为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个桌子的座位数量 - 它应该被添加。实现这一目标的最佳方法是什么?
答案 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