0

ゲームを選択するために VC1 を提示し、選択したゲームのプレイを送信するために VC2 を提示するアプリがあります。ユーザーが VC2 から VC1 に戻ったときに、プレイしていたゲームのゲーム データを保持したいと考えています。iOS 6.0 であるため、UIManagedDocument を使用して Core Data にアクセスし、ゲーム データを保存および取得しています。そして、私は直面している問題に完全に困惑しており、数え切れないほどの時間を費やした後、このフォーラムの賢明な人々に手を差し伸べています.

以下のコードをシミュレーターで実行すると、すべて正常に動作し、データが保存され、ユーザーが以前と同じゲームを選択してプレイした場合にデータを取得して表示することもできます。残念ながらデバイス上では、データがセグエに保存されていることがわかります - ブレークポイントを設定し、iExplorer を使用して persistentStore を調べました - しかし、保存されたゲームを選択して VC2 に戻るとすぐに、persistentStore が上書きまたは消去されたようですすべてのデータの。デバッガーで、"UIManagedDocument" の _persistentStoreCoordinator オブジェクトの _persistentStores NSArray プロパティが、デバイスで取得が行われると常に 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);
}

永続ストアに関するいくつかのログ情報

DEVICE
最初に VC2 に入り
ます ドキュメントの説明を印刷します->_persistentStoreCoordinator: ドキュメントの説明を印刷します->_persistentStoreCoordinator-> persistentStores: < _NSArrayM 0x1fd28ce0>(

)

VC2 終了時に VC2 で最初に設定する
ドキュメントの説明の印刷 ->_persistentStoreCoordinator: ドキュメントの説明の印刷 ->_persistentStoreCoordinator -> persistentStores: < _NSArrayM 0x1fd28ce0>( (URL: file://localhost/var/mobile/Applications/4DD2D219-5AC1- 406F-8020-260B01E46E0C/Documents/GameDB/StoreContent/persistentStore) )

2 番目に入力する VC2
文書の説明の印刷->_persistentStoreCoordinator: 文書の説明の印刷->_persistentStoreCoordinator-> persistentStores: < _NSArrayM 0x211d4660>(

)

SIMULATOR
まず VC2 に入る
文書の説明を印刷する ->_persistentStoreCoordinator: 文書の説明を印刷する ->_persistentStoreCoordinator -> persistentStores: < _NSArrayM 0x84e4b60>( (URL: file://localhost/Users/Rujul/Library/Application%20Support/iPhone %20Simulator/6.0/Applications/B187169B-8D32-4BB1-AB41-33DB76637D9C/Documents/GameDB/StoreContent/persistentStore) )

VC2 終了時に最初に設定する
ドキュメントの説明の印刷 -> _persistentStoreCoordinator: ドキュメントの説明の印刷 -> _persistentStoreCoordinator -> persistentStores: < _NSArrayM 0x84e4b60>( (URL: file://localhost/Users/Rujul/Library/Application%20Support/iPhone% 20Simulator/6.0/Applications/B187169B-8D32-4BB1-AB41-33DB76637D9C/Documents/GameDB/StoreContent/persistentStore) )

VC2 に入る 2回目
ドキュメントの説明の印刷 ->_persistentStoreCoordinator: ドキュメントの説明の印刷 ->_persistentStoreCoordinator -> persistentStores: < _NSArrayM 0xf777910>( (URL: file://localhost/Users/Rujul/Library/Application%20Support/iPhone% 20Simulator/6.0/Applications/B187169B-8D32-4BB1-AB41-33DB76637D9C/Documents/GameDB/StoreContent/persistentStore) )

4

1 に答える 1

0

コード内のすべての上書きをチェックします (上の のようにUIDocumentSaveForOverwriting)。前後の正確な値を記録します。この方法で確実に犯人を見つけます。

また、それぞれで何をしているのかを確認してくださいprepareForSegue:

addOrGetDataToGamesDatabaseところで、紛らわしいビジネスを 2 つの簡単に理解できる方法にリファクタリングすることをお勧めします。

于 2013-01-20T20:30:00.273 に答える