Ios 如果用户未登录iCloud,为什么UbiquityContainer为零?
我想使用UbiquityContainer对coredata进行iCloud备份。但是,如果我没有登录到模拟器上的iCloud,下面的Ios 如果用户未登录iCloud,为什么UbiquityContainer为零?,ios,core-data,icloud,ubiquitycontainer,Ios,Core Data,Icloud,Ubiquitycontainer,我想使用UbiquityContainer对coredata进行iCloud备份。但是,如果我没有登录到模拟器上的iCloud,下面的ubContainer将保持为零 -(void)addSqliteStoreToPersistentStoreCoordinator:(NSPersistentStoreCoordinator *)psc{ NSError *error = nil; NSFileManager *fm = [NSFileManager defaultManager
ubContainer
将保持为零
-(void)addSqliteStoreToPersistentStoreCoordinator:(NSPersistentStoreCoordinator *)psc{
NSError *error = nil;
NSFileManager *fm = [NSFileManager defaultManager];
NSURL *ubContainer = [fm URLForUbiquityContainerIdentifier:nil]; // Why nil???????
NSURL *storeURL = [ubContainer URLByAppendingPathComponent:@"f11Remote.sqlite"];
NSMutableDictionary *options = [NSMutableDictionary dictionary];
[options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
[options setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];
[options setObject:[NSDictionary dictionaryWithObjectsAndKeys:@"FULL", @"synchronous", nil] forKey:NSSQLitePragmasOption];
[options setObject:@"f11iCloudStore" forKey:NSPersistentStoreUbiquitousContentNameKey];
[options setValue:ubContainer forKey:NSPersistentStoreUbiquitousContentURLKey];
sqliteStore = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error];
if (!sqliteStore)
[NSException raise:@"FTDatastore: Couldn't open the local SQLite database." format:@"Reason: %@", [error localizedDescription]];
}
在用户登录到iCloud之前,我一直希望它的
离线版能够同时工作,并表现得像核心数据一样。可以做什么?如果用户没有激活iCloud,您需要一个后备存储
NSURL *storeDirectory = [[NSFileManager defaultManager]
URLForUbiquityContainerIdentifier:nil];
为什么nil
如果为此参数指定nil
,则此方法将返回com.apple.developer.ubiquity容器标识符数组中列出的第一个容器
如果生成的URL为nil
,则iCloud可能已禁用。您必须提供另一个URL
if (!storeDirectory) {
storeDirectory = [self applicationDocumentsDirectory]; // implement yourself
NSLog(@"Falling back to local store.");
}
如果用户未登录,则没有ubiquity容器。这就是为什么它是nil
。用户可以登录几个可能的iClouds帐户之一。每个都有自己的容器。“可以做什么?”可以做什么?这正如预期的那样有效。有什么问题吗?好吧,这是一个可怕的体系结构:你必须在多个地方处理一个持久存储。但是,嘿,那是iCloud。@rmaddy,所以我必须推出一个普通的coredata容器,以防用户注销,并在他每次重新登录时将其迁移到iCloud?谢谢你解释得这么好+1如果iCloud被禁用,我同意实施回退到本地存储。但是,如果用户已使用iCloud并突然决定注销,我该怎么办。本地后备存储将是空的,他将无法看到自己的数据。对于这种情况,也许我也应该将iCloud数据迁移到本地数据存储。