我剛開始在sql-lite中使用核心數據,所以我有點新。我基於各種教程在線創建了一個xcode核心數據應用程序供參考。對於它的價值,我將它整合到現有的cocos2d應用程序中。核心數據只能節省大約50%的時間
一切都還好,直到我注意到儲蓄並不總是工作。儘管上下文保存總是返回true,但有時我在取回舊數據時會返回該數據。不會產生錯誤。我已經調試過,以確保我傳遞了正確的數據來保存,但我不知道我做錯了什麼。
這是我的「SaveDataManager」的一部分,它處理保存和檢索數據。它是我的應用程序委託的實例對象。
保存功能。
- (bool) saveSongOptionData
{
NSManagedObjectContext *context = ((AppDelegate*)[[UIApplication sharedApplication] delegate]).managedObjectContext;
NSManagedObject *newData = [NSEntityDescription insertNewObjectForEntityForName:@"SongOptions" inManagedObjectContext:context];
NSEntityDescription *entityDesc = [NSEntityDescription entityForName:@"SongOptions" inManagedObjectContext:context];
//First check if row exists, if not create it. If so, update that row with our new high score information.
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDesc];
//Only should be 1 record, grab it
[request setFetchLimit:1];
NSManagedObject *matches = nil;
NSError *error;
NSArray *objects = [context executeFetchRequest:request error:&error];
if ([objects count] == 0) //None!! Lets create one
{
[newData setValue:[NSNumber numberWithBool:[GlobalVariables sharedInstance].background] forKey:@"background"];
[newData setValue:[NSNumber numberWithBool:[GlobalVariables sharedInstance].random] forKey:@"random"];
[newData setValue:[NSNumber numberWithBool:[GlobalVariables sharedInstance].vibrate] forKey:@"vibrate"];
}
else
{
matches = [objects objectAtIndex:0];
[matches setValue:[NSNumber numberWithBool:[GlobalVariables sharedInstance].background] forKey:@"background"];
[matches setValue:[NSNumber numberWithBool:[GlobalVariables sharedInstance].random] forKey:@"random"];
[matches setValue:[NSNumber numberWithBool:[GlobalVariables sharedInstance].vibrate] forKey:@"vibrate"];
}
[request release];
bool success = [context save:&error];
if (!success)
NSLog(@"%@", error.localizedDescription);
return success;
}
在我的AppDelegate我創造了我的 「SaveDataManager」 實例,並將它的背景下,像這樣的方法的applicationDidFinishLaunching:
self.dataManager = [[SavedDataManager alloc] init];
self.dataManager.managedObjectContext = self.managedObjectContext;
以及用於獲取上下文等
#pragma mark - Core Data stack
- (NSManagedObjectContext *)managedObjectContext
{
if (_managedObjectContext != nil)
return _managedObjectContext;
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil)
{
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return _managedObjectContext;
}
- (NSManagedObjectModel *)managedObjectModel
{
if (_managedObjectModel != nil)
return _managedObjectModel;
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"TestGame" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _managedObjectModel;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (_persistentStoreCoordinator != nil)
return _persistentStoreCoordinator;
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"TestGame.sqlite"];
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();
}
return _persistentStoreCoordinator;
}
我不確定這是否有足夠的信息,但如果有人能指導我爲什麼會出現這種情況,我會非常感激。
你是否從主線程保存? – user170317
好問題,基本上我這樣稱呼保存功能: AppDelegate * d =(AppDelegate *)[[UIApplication sharedApplication] delegate]; [d.dataManager saveSongOptionData]; 您認爲這可能是一個問題嗎? – Arbel