проблемы с сохранением в постоянное хранилище iphone

Я пишу приложение для iphone; Мне нужно сохранить данные в постоянном хранилище, но у меня проблемы... Я создал объект в xcdatamodel, и у меня нет проблем с получением значения по умолчанию для моего атрибута. В моем тестировании я несколько раз просматривал приведенный ниже код и могу изменить этот атрибут (это целое число), пока приложение активно. Однако, когда я закрываю и снова открываю приложение, мое целое число (myInt) возвращается к значению по умолчанию, когда я ожидал, что оно будет последним значением, до которого я его обновил. Вот что я делаю:

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 не меняет результат) Что я делаю неправильно?

Большое спасибо за Вашу помощь!


person san    schedule 06.03.2011    source источник


Ответы (1)


Было бы полезно, если бы вы могли показать свой код делегата приложения. Я предполагаю, что где-то вы сами сбрасываете данные. возможно, в методе загрузки начальных данных.

3 примечания на данный момент:

  1. вам не нужно размещать метод сохранения внутри цикла. вы должны разместить его после того, как все изменения будут сделаны и только один раз.
  2. проверьте, есть ли у вас метод сохранения, вызванный в (если не добавьте их):

        - (void)applicationWillTerminate:(UIApplication*)application {
           [self saveContext];
         } 
    
        - (void)applicationDidEnterBackground:(UIApplication*)application {
         [self saveContext];
        }
    
  3. если это не поможет, попробуйте посмотреть, загружаете ли вы значения по умолчанию при каждом обеде приложения.

УДАЧИ

и добро пожаловать

ИЗМЕНИТЬ

Эй, ты можешь сделать это -

- (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
    }
}
person shannoga    schedule 06.03.2011
comment
Шани, спасибо большое! Вы были правы в моем делегате приложения, я каждый раз инициировал объект: [NSEntityDescription insertNewObjectForEntityForName: @TestEntity inManagedObjectContext:managedObjectContext]; Вы можете сказать, что я новичок, я уверен. Я хочу сделать это только один раз. Как узнать, сделал ли я это уже? Большое спасибо! - person san; 06.03.2011
comment
Это Шани! Все работает, как я и хотел. Большое спасибо. - person san; 06.03.2011