2016-07-25 105 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