Fetch на Core Data работает в симуляторе, но не на устройстве
У меня есть приложение, в котором я представляю VC1, чтобы выбрать игру, и VC2, чтобы представить игры для выбранной игры. Когда пользователь переходит с VC2 на VC1, я хочу сохранить данные игры для игры, в которую они играли. Поскольку это iOS 6.0, я использую UIManagedDocument для доступа к основным данным для хранения и извлечения игровых данных. И я полностью озадачен проблемой, с которой я сталкиваюсь, и, проведя бесчисленные часы, я обращаюсь к мудрым людям на этом форуме.
Когда я запускаю приведенный ниже код в симуляторе, все работает нормально, данные сохраняются, и я также могу получить их и показать, если пользователь выбирает ту же игру, что и раньше, чтобы играть. К сожалению, на устройстве я вижу, что данные сохраняются в segue - я поставил точку останова и посмотрел на persistentStore с помощью iExplorer - но как только я возвращаюсь к VC2, выбирая сохраненную игру, persistentStore кажется перезаписанным или очищенным всех данных. В отладчике я заметил, что свойство _persistentStores NSArray объекта _persistentStoreCoordinator для "UIManagedDocument" всегда показывает 0, когда поиск выполняется на устройстве.
Любая помощь высоко ценится!!!
- (void) addOrGetDataToGamesDatabase:(CNPUIManagedDocument *)document withFlag:(BOOL)getFlag {
if (getFlag) {
NSLog(@"INSIDE addDataToGamesDatabase to get data");
}
else
NSLog(@"INSIDE addDataToGamesDatabase to set data");
dispatch_queue_t update = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0);
dispatch_sync(update, ^{
[document.managedObjectContext performBlockAndWait:^{
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Game"];
request.predicate = [NSPredicate predicateWithFormat:@"game = %@", self.selectedGameID];
NSError *error = nil;
NSLog(@"Persistent Store Name = %@", [[document class] persistentStoreName]);
NSArray *matches = [document.managedObjectContext executeFetchRequest:request error:&error];
NSLog(@"Fetch Error if any: %@ %@", error.debugDescription, [error userInfo]);
if (!matches || matches.count >1) {
NSLog(@"There is a problem with creating the game data");
}
//This is where it fails on the device as the match.count is always 0 as the fetch retrieves nothing
else if ([matches count] == 0) {
if (!getFlag) {
// Code to initialize the game data in store
}
}
else if ([matches count] == 1) {
// Another fetch - nested
if (!oTeammatches || [oTeammatches count] >1) {
NSLog(@"There is a problem with creating the offense team data");
}
else if ([oTeammatches count] == 0) {
if (!getFlag) {
//Code to initialize the team data in store
}
}
else if ([oTeammatches count] == 1) {
OTeam *newOTeam = [oTeammatches lastObject];
if (getFlag) {
//Retrieves data
//Shown by log lines beginning with "Getting"
}
else {
//Sets/Saves data
//Shown by log lines beginning with "Setting"
}
}
}
}];
if (!getFlag) {
[document updateChangeCount:UIDocumentChangeDone];
}
});
}
- (IBAction)pressBackButton:(UIButton *)sender {
[self addOrGetDataToGamesDatabase:self.gamesDatabase withFlag:NO];
if ((self.gamesDatabase.documentState & UIDocumentStateEditingDisabled) != UIDocumentStateEditingDisabled) {
[self.gamesDatabase saveToURL:self.gamesDatabase.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:^(BOOL success) {
if (success) {
NSLog(@"DB save file path: %@", self.gamesDatabase.fileURL);
NSLog(@"Saved!!!");
}
else
NSLog(@"Unable to save");
}];
}
[self performSegueWithIdentifier:@"BackToPickGame" sender:self];
}
- (void)viewDidLoad
{
[super viewDidLoad];
//Some Initialization code
if (!self.gamesDatabase) {
NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:@"GameDB"];
self.gamesDatabase = [[CNPUIManagedDocument alloc] initWithFileURL:url];
NSLog(@"DB File URL generated: %@", url);
NSLog(@"self.gameDatabase initialized");
}
[self addOrGetDataToGamesDatabase:self.gamesDatabase withFlag:YES];
NSLog(@"Calling game with ID %@ , self.selectedGameID);
}
Некоторая информация журнала в постоянном магазине
УСТРОЙСТВО
Сначала войти на VC2
Печать описания документа ->_persistentStoreCoordinator: Печать описания документа -> _ persistentStoreCoordinator-> persistentStores: < _NSArrayM 0x1fd28ce0> (
)
Первый набор в VC2 при выходе из VC2
Печать описания документа ->_persistentStoreCoordinator: Печать описания документа -> _ persistentStoreCoordinator-> persistentStores: < _NSArrayM 0x1fd28ce0> ((URL: файл://localhost/var/mobile/Applications/4DD2D219-5AC1-406F-8020-260B01E46EC Документы /GameDB/StoreContent/persistentStore))
Второй получить при входе в VC2
Печать описания документа ->_persistentStoreCoordinator: Печать описания документа -> _ persistentStoreCoordinator-> persistentStores: < _NSArrayM 0x211d4660> (
)
Имитатор
Сначала войти на VC2
Печать описания документа ->_persistentStoreCoordinator: Печать описания документа -> _ persistentStoreCoordinator-> persistentStores: < _NSArrayM 0x84e4b60> ((URL: файл: //localhost / Users/Rujul / Library/Application%20Support / iPhone%20Simulator/6) /B187169B-8D32-4BB1-AB41-33DB76637D9C/ Документы /GameDB/StoreContent/persistentStore))
Первый набор на выходе из VC2
Печать описания документа ->_persistentStoreCoordinator: Печать описания документа -> _ persistentStoreCoordinator-> persistentStores: < _NSArrayM 0x84e4b60> ((URL: файл: //localhost / Users/Rujul / Library/Application%20Support / iPhone%20Simulator/6) /B187169B-8D32-4BB1-AB41-33DB76637D9C/ Документы /GameDB/StoreContent/persistentStore))
Второй получить при входе в VC2
Печать описания документа ->_persistentStoreCoordinator: печать описания документа -> _ persistentStoreCoordinator-> persistentStores: < _NSArrayM 0xf777910> ((URL: файл://localhost/Users/Rujul/Library/Application%20Support/iPhone%20Simpp.0/6) /B187169B-8D32-4BB1-AB41-33DB76637D9C/ Документы /GameDB/StoreContent/persistentStore))
1 ответ
Проверьте все перезаписи в вашем коде (как указано выше в UIDocumentSaveForOverwriting
). Записывайте точные значения до и после. Я уверен, что вы найдете виновника таким образом.
Кроме того, проверьте, что вы делаете в каждом prepareForSegue:
,
Кстати, я бы порекомендовал, возможно, рефакторинг addOrGetDataToGamesDatabase
дело в два легко понятных метода.