1

我想使用 UbiquityContainer 来对 coredata 进行 iCloud 备份。但是,如果我没有在模拟器上登录 iCloud,则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]];
}

我期待它的一个offline版本同时工作并且表现得像核心数据,直到用户登录到 iCloud。可以做什么?

4

1 回答 1

1

如果用户没有激活 iCloud,您需要一个备用存储。

NSURL *storeDirectory = [[NSFileManager defaultManager] 
                        URLForUbiquityContainerIdentifier:nil];

为什么nil

如果您nil为此参数指定,此方法将返回com.apple.developer.ubiquity-container-identifiers权利数组中列出的第一个容器。

如果生成的 URL 为nil,则 iCloud 可能已禁用。您必须提供替代 URL。

if (!storeDirectory) {
   storeDirectory = [self applicationDocumentsDirectory]; // implement yourself
   NSLog(@"Falling back to local store.");
}
于 2015-05-28T08:16:44.363 回答