2011-03-06 139 views
0

我正在寫一個iphone應用程序;我需要將數據保存到持久性存儲,但我遇到問題... 我在xcdatamodel中創建了一個實體,並且我沒有問題獲取爲我的屬性設置的默認值。在我的測試中,我通過下面的代碼幾次,並可以在應用程序處於活動狀態時更改此屬性(它是一個整數)。但是,當我關閉並重新打開應用程序時,我的整數(myInt)返回到默認值,當我預期它是我更新它的最後一個值。 下面是我在做什麼:存儲問題永久存儲iphone

NSManagedObjectContext *managedObjectContext = appDelegate.managedObjectContext; 
NSEntityDescription *myTestEntity = [NSEntityDescription 
             entityForName:@"TestEntity" 
             inManagedObjectContext:managedObjectContext]; 

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 

[fetchRequest setEntity:timeStampEntity]; 

NSError *error = nil; 
NSArray *fetchedObjects = [managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
if (fetchedObjects == nil) { 
    // TODO: Handle the error 
} 
for (id oneObject in fetchedObjects) 
{ 
    NSInteger myInt = [[oneObject valueForKey:@"myStoredInt"]intValue]; 
    myInt++; 
    [oneObject setValue:[NSNumber numberWithInt: myInt] forKey:@"myStoredInt"]; 
    NSError *error = nil; 
    if (![managedObjectContext save:&error]) {//TODO: Handle error  
    } 
} 

[fetchRequest release]; 

我希望這條線:

if (![managedObjectContext save:&error]) 

會做的工作,並保存更改到永久存儲,但它不會! (在for循環內部或外部有這條線不會改變結果) 我在做什麼錯了?

非常感謝您的幫助!

回答

3

如果您可以顯示您的應用程序委託代碼將會很有幫助。我的猜測是,你正在重新設置自己的數據。也許在加載啓動數據的方法中。

3筆記現在:

  1. 你不需要放置在循環內保存 方法。你應該在 之後放置它,所有的更改都是 而且只是一次。
  2. 檢查,如果你調用的保存方法(如果不添加的話):

    - (void)applicationWillTerminate:(UIApplication*)application { 
         [self saveContext]; 
        } 
    
        - (void)applicationDidEnterBackground:(UIApplication*)application { 
        [self saveContext]; 
        } 
    
  3. 如果劑量忍不住試一試,看是否要加載的應用程序的每一個午餐的默認值。

GOOD LUCK

,並歡迎

編輯

嘿,你能做到這一點 -

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 

    if (persistentStoreCoordinator_ != nil) { 
     return persistentStoreCoordinator_; 
    } 

    NSURL *storeURL = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory]            stringByAppendingPathComponent: @"anyname.sqlite"]]; 

    //check if the store already exist? 
    BOOL firstRun = NO; 
    if (![[NSFileManager defaultManager] fileExistsAtPath:[storeURL path] isDirectory:NULL]) { 
     firstRun = YES;  
    } 

    NSError *error = nil; 
    persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { 

     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    }  

    if(firstRun){ 
     //add your default data here 
    } 
} 
+0

沙尼,太感謝你了!你是對的 - 在我的應用程序委託中,我每次都啓動對象:[NSEntityDescription insertNewObjectForEntityForName:@「TestEntity」inManagedObjectContext:managedObjectContext];我敢打賭,你可以告訴我是新手。我只想做一次 - 我怎麼知道我是否已經做到了?非常感謝! – san 2011-03-06 08:16:05

+0

嘿。我編輯了我的答案。 – shannoga 2011-03-06 08:54:49

+0

這就是沙尼!它像我想要的那樣工作,非常感謝 – san 2011-03-06 19:26:51