Core Data多配置场景下如何查询托管对象所属的持久化存储?
解决方案
你可以直接通过NSManagedObject实例自带的persistentStore属性查询其所属的持久化存储,无需额外自定义字段存储标记,具体操作方式如下:
步骤1:提前给两个持久化存储设置唯一标识
你在创建NSPersistentStoreDescription时,可以直接给configuration属性设置自定义名称用于后续区分:
// Swift 示例 let cloudDesc = NSPersistentStoreDescription(url: cloudStoreURL) cloudDesc.configuration = "CloudSyncConfig" cloudDesc.cloudKitContainerOptions = .init(containerIdentifier: "你的iCloud容器ID") let localDesc = NSPersistentStoreDescription(url: localStoreURL) localDesc.configuration = "LocalOnlyConfig" container.persistentStoreDescriptions = [cloudDesc, localDesc]
// Objective-C 示例 NSPersistentStoreDescription *cloudDesc = [[NSPersistentStoreDescription alloc] initWithURL: cloudStoreURL]; cloudDesc.configuration = @"CloudSyncConfig"; cloudDesc.cloudKitContainerOptions = [[NSPersistentCloudKitContainerOptions alloc] initWithContainerIdentifier: @"你的iCloud容器ID"]; NSPersistentStoreDescription *localDesc = [[NSPersistentStoreDescription alloc] initWithURL: localStoreURL]; localDesc.configuration = @"LocalOnlyConfig"; container.persistentStoreDescriptions = @[cloudDesc, localDesc];
步骤2:查询托管对象所属存储
拿到任意已持久化的托管对象后,直接读取属性判断即可:
// Swift 示例 func getObjectStoreType(for obj: NSManagedObject) -> String? { guard let store = obj.persistentStore else { return nil // 对象尚未保存到持久化存储 } switch store.configurationName { case "CloudSyncConfig": return "iCloud同步存储" case "LocalOnlyConfig": return "本地独立存储" default: return "未知存储" } }
// Objective-C 示例 - (NSString *)getObjectStoreType:(NSManagedObject *)obj { NSPersistentStore *store = obj.persistentStore; if (!store) return nil; // 对象尚未保存到持久化存储 if ([store.configurationName isEqualToString:@"CloudSyncConfig"]) { return @"iCloud同步存储"; } else if ([store.configurationName isEqualToString:@"LocalOnlyConfig"]) { return @"本地独立存储"; } return @"未知存储"; }
注意事项
- 仅已成功保存到持久化层的托管对象能正确读取到
persistentStore属性,刚插入上下文还未执行保存操作的对象该属性返回nil - 如果你没有提前给存储配置设置名称,也可以直接将读取到的
persistentStore实例和你初始化时持有的云存储、本地存储实例做指针对比,判断逻辑完全一致 persistentStore为只读属性,调整对象所属存储只能使用官方提供的assignObject:toPersistentStore:方法,无法直接修改该属性值
内容的提问来源于stack exchange,提问作者Miguel Carvalho
相关产品推荐
相关产品推荐

