Ios 如何保证主机应用程序和扩展程序使用的共享应用程序容器中的核心数据存储中的唯一条目? 为了有效地提出我的问题,让我们先考虑一下我面临的具体情况:
常规设置Ios 如何保证主机应用程序和扩展程序使用的共享应用程序容器中的核心数据存储中的唯一条目? 为了有效地提出我的问题,让我们先考虑一下我面临的具体情况:,ios,sqlite,core-data,watchkit,ios-extensions,Ios,Sqlite,Core Data,Watchkit,Ios Extensions,常规设置 主机iOS 8应用程序 与主机应用捆绑的一个或多个iOS 8扩展(WatchKit、Share等) 主机应用程序和所有扩展程序在共享应用程序组容器中共享同一核心数据SQLite存储 每个应用程序/扩展都有自己的NSPersistentStoreCoordinator和NSManagedObjectContext 每个持久存储协调器使用一个持久存储,该持久存储与所有其他持久存储在组容器中共享相同的SQLite资源 该应用程序和所有扩展都使用一个公共代码库来同步来自Internet上远程
- 主机iOS 8应用程序
- 与主机应用捆绑的一个或多个iOS 8扩展(WatchKit、Share等)李>
- 主机应用程序和所有扩展程序在共享应用程序组容器中共享同一核心数据SQLite存储
- 每个应用程序/扩展都有自己的NSPersistentStoreCoordinator和NSManagedObjectContext
- 每个持久存储协调器使用一个持久存储,该持久存储与所有其他持久存储在组容器中共享相同的SQLite资源
- 该应用程序和所有扩展都使用一个公共代码库来同步来自Internet上远程API资源的内容
uniqueID
等于解析的uniqueIDuniqueID
属性设置为已解析的uniqueIDsave:
时,核心数据将愉快地创建重复条目
据我所知,核心数据无法将属性标记为唯一的。我需要一个核心数据相当于一个。或者我需要一种方法来“锁定”持久性存储的SQLite备份存储,这听起来像是一个麻烦的配方
对于iOS 8扩展引入的这一相当新颖的问题,是否有一种已知的解决方法?解决这一问题的最简单方法似乎是首先避免多个编写器。为什么不直接将您的扩展完全从缓存数据中删除,然后只从主iOS应用程序更新您的数据存储 对于iOS 8扩展引入的这个相当新颖的问题,有没有一种已知的方法 是的,这与使用iCloud处理核心数据时采用的方法相同:让重复发生,然后去清理它们。这两种情况都有创建重复条目的风险,并且没有完全可靠的方法来防止它们。由于您有一个
uniqueID
键,因此您的状态良好
正如戴夫·德隆(Dave DeLong)指出的那样,从一开始就避免这个问题要容易得多。如果这是不可能的,你可以处理它,与一些额外的工作
查找重复项类似于:
NSError *error = nil;
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] init];
[moc setPersistentStoreCoordinator:self.persistentStoreCoordinator];
NSFetchRequest *fr = [[NSFetchRequest alloc] initWithEntityName:@"MyEntityName"];
[fr setIncludesPendingChanges:NO];
NSExpression *countExpr = [NSExpression expressionWithFormat:@"count:(uniqueID)"];
NSExpressionDescription *countExprDesc = [[NSExpressionDescription alloc] init];
[countExprDesc setName:@"count"];
[countExprDesc setExpression:countExpr];
[countExprDesc setExpressionResultType:NSInteger64AttributeType];
NSAttributeDescription *uniqueIDAttr = [[[[[_psc managedObjectModel] entitiesByName] objectForKey:@"MyEntityName"] propertiesByName] objectForKey:@"uniqueID"];
[fr setPropertiesToFetch:[NSArray arrayWithObjects:uniqueIDAttr, countExprDesc, nil]];
[fr setPropertiesToGroupBy:[NSArray arrayWithObject:uniqueIDAttr]];
[fr setResultType:NSDictionaryResultType];
NSArray *countDictionaries = [moc executeFetchRequest:fr error:&error];
这与SQL中类似的内容相当于核心数据:
SELECT uniqueID, COUNT(uniqueID) FROM MyEntityName GROUP BY uniqueID;
您将获得一个字典数组,每个字典都包含一个uniqueID
,以及使用该值的次数计数。通读字典,适当地处理重复的内容
我在中更详细地描述了这一点。苹果公司也有一个示例项目演示了这个过程,名为SharedCodeData,但我相信它只是这个过程的一部分。在那次会议的第227次会议中也对其进行了描述。为什么在主机进入后台模式时不取消/暂停GET请求?我在核心数据哑时也得到了重复的条目,在核心数据Upsert序列的第2步中:如果有多个结果,我会删除额外的插入。这是推荐的方法。