2016-07-25 108 views
0

我试图更新领域数据库,但无法弄清楚。更新领域数据库

我正在使用[realm addObject:info];,但这只是将相同的对象添加到已存在的Realm数据库中。

然后我用[People createOrUpdateInRealm:realm withValue:info];替换了那个,但是只添加了我的人信息数组中的最后一项(有6个人,但Realm数据库只显示第六人信息)。

不知道我在做什么错?

People.h:

@property (nonatomic) NSString *fname; 
@property (nonatomic) NSString *lname; 
@property (nonatomic) NSString *flName; 
@property (nonatomic) NSString *email; 
@property (nonatomic) NSString *phone; 
@property (nonatomic) NSString *video; 
@property (nonatomic) NSString *pdf; 
@property (nonatomic) NSString *pKey; 

+ (NSString *)primaryKey; 

People.m:

+ (NSString *)primaryKey 
{ 
    return @"pKey"; 
} 

TableViewController.m:

RLMRealm *realm = [RLMRealm defaultRealm]; 
for (id item in responseArray) { 
    [realm beginWriteTransaction]; 

    People *info = [[People alloc] init]; 
    info.fname = item[@"fname"]; 
    info.lname = item[@"lname"]; 
    info.flName = [NSString stringWithFormat:@"%@ %@", item[@"fname"], item[@"lname"]]; 
    info.phone = item[@"phone"]; 
    info.video = item[@"video"]; 
    info.pdf = item[@"pdf"]; 

    [People createOrUpdateInRealm:realm withValue:info]; 
    [realm commitWriteTransaction]; 
} 

responseArray来自API的数据。

+0

你放了RLMRealm * realm = [RLMRealm defaultRealm];在循环中,所以每次都会写完。把它放在循环之外 –

+0

@TejaNandamuri我将更新我的代码。出于某种原因,我仍然遇到同样的问题? – SRMR

+0

将调用放置到'[RLMRealm defaultRealm]'与您看到的任何问题无关。 – bdash

回答

2

您没有提供+primaryKey方法的定义,但是我的怀疑是您的pKey属性是您的主键。您没有在您创建的info对象上设置pKey属性,导致它保留默认值nil。这意味着+createOrUpdateInRealm:withValue:看到您要求每次在循环中更新同一对象:主键为nil的对象。

在调用+createOrUpdateInRealm:withValue:之前,在info上设置pKey属性应导致所有对象按预期保存。

还要注意,最好尽量减少写入事务的数量,因为每个写入事务都有一定的开销。在这种情况下,您可以轻松地将写入事务移到循环之外。

+0

这听起来很像我想它可能是,但我仍然对如何实现正确的理解有点朦胧。我在我的问题中添加了我的People.m文件,以便您可以看到它。因此,我应该继续在'People'.h/.m中设置'pKey',并且应该如何做到这一点?然后,我的'TableViewController.m'保持不变,还是应该在那里做一些不同的事情?我很抱歉让你帮助我进一步讨论这个问题,但对于我有什么问题有一个朦胧的想法,但对于解决如何完全实现正确的解决方案而言,这足够了。 – SRMR

+0

我认为你需要做的唯一改变就是为你的循环内的代码在TableViewController.m中给予pKey属性一个值。据推测,“item”字典提供了一个唯一标识符,允许您标识每个“People”实例,以便具有该标识符的现有对象可以更新而不是重复。 – bdash

+0

不幸的是'item'字典没有提供唯一的标识符来标识每个'People'实例。我假设其他人也有这个问题,所以我仍然四处寻找解决方案,因为必须有一个 – SRMR