4

Core Data を使用する iPad アプリケーションがあります。

ユーザーに別のバックアップ方法を提供するために、sqlite ファイルの Dropbox 同期を使用しようとしています。

ドロップボックスからのバックアップと復元は問題ありません。ただし、復元したデータを表示するには、アプリケーションをリセットする必要があります

これは、永続ストアがまだ古いファイルを使用しているためだと思います。

古いモデルを強制終了して再度開くにはどうすればよいですか?

私は運がないので次のことを試しました:

 NSPersistentStore* store = [[_persistentStoreCoordinator persistentStores] lastObject];
[_persistentStoreCoordinator removePersistentStore:store error:nil];
[__managedObjectModel release];
__managedObjectModel = nil;
[_persistentStoreCoordinator release];
_persistentStoreCoordinator = nil;
[self persistentStoreCoordinator];
[self managedObjectContext];
[self managedObjectModel];
4

2 に答える 2

2

最後に、永続ストアをリロードする次の方法を使用しました。

NSError *error;
// retrieve the store URL
NSURL * storeURL = [[__managedObjectContext persistentStoreCoordinator] URLForPersistentStore:[[[__managedObjectContext persistentStoreCoordinator] persistentStores] lastObject]];
// lock the current context
[__managedObjectContext lock];
[__managedObjectContext reset];//to drop pending changes
//delete the store from the current managedObjectContext
if ([[__managedObjectContext persistentStoreCoordinator] removePersistentStore:[[[__managedObjectContext persistentStoreCoordinator] persistentStores] lastObject] error:&error])
{

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
    [[__managedObjectContext persistentStoreCoordinator] addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error];//recreates the persistent store
}

dispatch_async(dispatch_get_main_queue(), ^{
    self.ready = YES;
    [[NSNotificationCenter defaultCenter]postNotificationName:kModelDidChange object:nil];
});

[__managedObjectContext unlock];
于 2013-01-19T11:25:30.390 に答える
0

私の場合、新しいストアを作成する必要がなく、単純に既存のストアを使用する、さらに単純なものを見つけましたが、移動したためにコンテンツが変更されたと Core Data に認識させます。

NSPersistentStore* store = [[_persistentStoreCoordinator persistentStores] lastObject];
[_persistentStoreCoordinator setURL:store.URL forPersistentStore:store];

もちろん、MOC がロックされている間にこれを行う必要があります。AFAICT、上記は暗黙的にMOCをリセットしますが、提案したソリューションのように手動で行うこともできます。

于 2014-10-13T08:27:02.330 に答える