UITableView
私は、ユーザーが別のビューに入力することによって入力される単純なアプリケーションを持っていUITextFields
ます。この情報は に保存されCoreData
、UITableView
を使用して更新されNSFetchedResultsController
ます。
現在、私の環境に iCloud 同期を導入しています。以前に寄せられた質問:既存のコア データ データベースが iCloud にアップロードされていない場合、アプリで iCloud を有効にすると、まだ問題がありますが、新しいコードでその質問を更新するには面倒でした。私は特にWWDC 2013 CoreData
セッションとこれについて言及しています。私のアプリはiOS 7のみです。私は iCloud 開発の初心者で、中級プログラマーです。
App Store (iCloud 以外) バージョンから開発 (iCloud) バージョンにアップデートするときに、既存のデータを iCloud に移行するのが非常に困難です。新しいデータは完全に同期されます。
基本的に既存のストアを iCloud なしで取得し、それを iCloud に移行する必要があることは理解していますが、うまくいきません。
私が取り組んでいることを説明するためのコードを次に示します。
アップデート
私はこれについて調べて考え、冗長なコードを削除しました。
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Planner.sqlite"];
NSFileManager *fm = [NSFileManager defaultManager];
NSURL *url = [fm URLForUbiquityContainerIdentifier:nil];
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (url)
{
NSLog(@"iCloud is enabled");
NSDictionary *options = @{
NSMigratePersistentStoresAutomaticallyOption : @YES,
NSInferMappingModelAutomaticallyOption : @YES,
};
NSPersistentStore *localStore = [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error];
[_persistentStoreCoordinator migratePersistentStore:localStore toURL:[self iCloudURL] options:[self iCloudStoreOptions] withType:NSSQLiteStoreType error:&error];
}
else
{
NSLog(@"iCloud is not enabled");
NSDictionary *options = @{
NSMigratePersistentStoresAutomaticallyOption : @YES,
NSInferMappingModelAutomaticallyOption : @YES
};
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[self iCloudURL] options:options error:&error])
{
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:@"Reload" object:self userInfo:nil];
});
return _persistentStoreCoordinator;
}
migrateLocalStoreToiCloud メソッドを呼び出すことはもうありませんが、参照用にここにあります。
/*-(void)migrateLocalStoreToiCloud
{
//assuming you only have one store.
NSPersistentStore *store = [[_persistentStoreCoordinator persistentStores] firstObject];
NSPersistentStore *newStore = [_persistentStoreCoordinator migratePersistentStore:store
toURL:[self iCloudURL]
options:[self iCloudStoreOptions]
withType:NSSQLiteStoreType
error:nil];
[self reloadStore:newStore];
}
*/
、storeURL
、およびコードは次storeOptions
のとおりです。iCloudURL
iCloudStoreOptions
- (NSURL *)iCloudURL
{
NSFileManager *fm = [NSFileManager defaultManager];
NSURL *url = [fm URLForUbiquityContainerIdentifier:nil];
if (url) {
NSLog(@"iCloud access at %@", url);
} else {
NSLog(@"No iCloud access");
}
return url;
}
-(NSURL *)storeURL{
return [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Planner.sqlite"];
}
-(NSDictionary *)storeOptions{
NSMutableDictionary *options = [[NSMutableDictionary alloc] init];
[options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
[options setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];
return options;
}
-(NSDictionary *)iCloudStoreOptions{
NSMutableDictionary *options = [[NSMutableDictionary alloc] init];
[options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
[options setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];
[options setObject:@"PlannerStore" forKey:NSPersistentStoreUbiquitousContentNameKey];
return options;
}
問題
このコードをそのまま実行すると、コンソールに Using が表示されず、データは存在しますが、まったく表示されませLocal Storage : 1
ん0
。
オプションとしてpersistentStoreCoordinator
使用するpersistentStoreを最初に追加する場所を変更すると、とが表示されますが、データはデバイス上にありません。[self iCloudStoreOptions]
Using Local Storage 1
0
私はこちらのガイダンスに従っており、 reloadStore メソッドでpersistentStoreを削除しないなど、コードの複数のバリエーションを試しましたが、完全に行き詰まりました。
私は非常に多くの投稿を読みましたが、iCloud 以外のバージョンから iCloud バージョンにデータを移行している人を見つけることができないようで、私が見つけた例ではコードがありません。
私はこれを調べましたが、これは優れたコード セットですが、コードをダウンロードし、persistentStore を削除しないというガイドラインに従いましたが、それでもうまくいきません。私が達成しようとしていることが非常に複雑であるとは想像できません。既存の iCloud 以外のデータを取得して、iCloud に移行する必要があるだけです。
アップデート
Apple のガイドを読むと: https://developer.apple.com/LIBRARY/ios/documentation/DataManagement/Conceptual/UsingCoreDataWithiCloudPG/UsingSQLiteStoragewithiCloud/UsingSQLiteStoragewithiCloud.html#//apple_ref/doc/uid/TP40013491-CH3-SW2私のmigrateLocaltoiCloud
方法は現在persistentStore
、などの削除で間違っていますが、修正方法がわかりません。からこれを呼び出すpersistentStoreCoordinator
と、何らかの形で に干渉しDidChangeNotification
ますか?
私は本当にこれにこだわっています。正しい方向へのガイダンスをいただければ幸いです