2014-11-15 112 views
0

我對使用核心數據保存實體有點困惑。我正在製作一個屏幕,允許用戶保存他們的設置(聯繫信息),如果他們願意,可以稍後再進行更改。將核心數據保存到只有一個實體

從我所瞭解的情況來看,下面的代碼會在每次按下「保存」按鈕時保存多個實體。

- (IBAction)saveSettings:(id)sender { 

    AppDelegate *appDelegate = 
    [[UIApplication sharedApplication] delegate]; 

    NSManagedObjectContext *context = 
    [appDelegate managedObjectContext]; 
    NSManagedObject *userSettings; 


    userSettings = [NSEntityDescription 
        insertNewObjectForEntityForName:@"UserSettings" 
        inManagedObjectContext:context]; 
    [userSettings setValue: _firstName.text forKey:@"firstName"]; 
    [userSettings setValue: _lastName.text forKey:@"lastName"]; 
    [userSettings setValue: _userEmail.text forKey:@"userEmail"]; 
    [userSettings setValue: _zipCode.text forKey:@"zipCode"]; 
} 

什麼我不知道如何做的是保存一個實體,然後更改以後每當新值用戶在相應的文本字段並按下「保存」屬性的值。

回答

1

是 - 因爲你用insertNewObjectForEntityForName:,新UserSettings每次運行方法時,對象被創建。你可能想要做的是從數據庫中獲取現有的設置,用這些數據更新你的textFields,呈現視圖並讓用戶根據需要修改細節,然後(當他們按下保存按鈕時)保存該數據回到數據庫。

我想補充userSettings作爲一個屬性:

@property (strong, nonatomic) NSManagedObject *userSettings; 

,並在你的方法刪除userSettings你在哪裏使用insertNewObjectForEntityForName的聲明,而行。

然後創建以處理從數據庫中獲取數據,並將其分配給您的文本框的新方法,具體如下:

-(void)loadSettings { 

    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
    NSManagedObjectContext *context = [appDelegate managedObjectContext]; 

    NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"UserSettings"]; 
    NSError *error; 
    NSArray *results = [context executeFetchRequest:fetch error:&error]; 
    if (results == nil) { 
     // some error handler here 
    } 
    if ([results count] > 0) { 
     userSettings = [results lastObject]; 
     _firstName.text = [userSettings valueForKey:@"firstName"]; 
     _lastName.text = [userSettings valueForKey:@"lastName"]; 
     _userEmail.text = [userSettings valueForKey:@"userEmail"]; 
     _zipCode.text = [userSettings valueForKey:@"zipCode"]; 
    } else { 
     // set your text fields to some defaults values?? 
    } 
} 

調用此方法時,您的視圖控制器負載,在viewDidLoad方法。我假定你通常只有一個UserSettings對象(因此lastObject將是唯一的對象!)。如果您可以有許多UserSettings對象,則需要過濾提取以獲取所需的對象。要做到這一點,您需要設置一個predicate用於獲取 - 請查看NSPredicate的文檔。

+0

謝謝你的回答,這很有道理! 我幾乎完成了這些更改,但有幾個問題;你可以聊聊天嗎? – narner

+0

當然 - 你能建立一個會議嗎? – pbasdf

+0

是!以下是鏈接: http://chat.stackoverflow.com/rooms/65007/core-data-saving-to-only-one-entity – narner

0

實際上,每次「設置」時都會覆蓋這些屬性。存儲個別屬性的正確方法是給它們分配和保存,就像這樣:

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 

NSManagedObjectContext *context = [appDelegate managedObjectContext]; 
NSManagedObject *userSettings; 


userSettings = [NSEntityDescription insertNewObjectForEntityForName:@"UserSettings" 
       inManagedObjectContext:context]; 


userSettings.firstName = _firstName.text; 
userSettings.lastName = _lastName.text; 
userSettings.userEmail = _userEmail.text; 
userSettings.zipCode = _zipCode.text; 


NSError *error = nil; 
if (![context save:&error]) { 

    NSLog(@"Error Saving: %@", error); 
} 
+0

嘿馬科斯,謝謝你的回覆。我看到了差異,但我不確定我是否明白爲什麼需要分配和保存,而不是設置屬性。 – narner