0

私は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ループの内側または外側に配置しても、結果は変わりません)何が間違っていますか?

ご助力ありがとうございます!

4

1 に答える 1

3

アプリのデリゲートコードを表示できれば便利です。私の推測では、どこかでデータを自分でリセットしていると思います。多分あなたが開始データをロードする方法で。

今のところ3つのメモ:

  1. ループ内にsaveメソッドを配置する必要はありません。すべての変更が行われた後、一度だけ配置する必要があります。
  2. (追加しない場合は)で呼び出されたsaveメソッドがあるかどうかを確認します。

        - (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
    }
}
于 2011-03-06T06:28:41.630 に答える