是否有任何解决方案可以获得整个Enity的最后修改日期?每个NSManagedObject
的时间戳都不是一个好的解决方案,因为应用程序与Web服务同步(其中一些会在旧日期的数据库中)。
每次用户决定更新列表时,我都需要为整个实体制作一个时间戳,以便我可以在SSPullToRefresh
中显示此日期。
我脑海中只有一个解决方案:NSUserDefaults
但它是保持实体上次修改日期的好地方吗?
答案 0 :(得分:2)
实现此目的的一种方法是创建一个实体,其唯一目的是跟踪实体的修改。它可能看起来像:
LastModified:
date (NSDate*)
key (NSString*)
您可以将key
属性视为实体名称
您可以在启动时填充这些实体(如果需要)
您还可以创建一个全球词典,在发布时将key
映射到objectID
。
您使用此对象的方式是:
当您开始同步操作时,您将获取应更新的实体并将其设置为当前日期,如果您知道哪些实体将更新(更好地反映现实)。
如果没有,则在保存之前查看上下文的所有更新,插入,删除的集合并创建一组已更改的实体类型并更新与这些键对应的LastModified
对象(实体名称)点。
这种方法的好处是:
缺点:
key
的实体(并且您不知道在同步中将更新哪些密钥),则维护起来会更复杂(您可能希望使用实体userInfo
字典来存储key
,以便不同的实体可以更新相同的修改日期。答案 1 :(得分:1)
我过去使用的策略是查找实体类型的最近修改记录。
因此,假设您有一个联系实体,并且您希望同步上次执行同步时的任何更改。查询所有本地联系人记录,并按lastModifiedDate
降序排序。返回的第一个结果是您在查询Web服务时要使用的时间戳。
在编写本教程How To Synchronize Core Data with a Web Service
时,我使用了这种策略我发现的最大优势是您无需担心确保服务器时间与设备的本地时间同步。如果它们在几分钟后关闭,你就不会“错过”任何事情。
答案 2 :(得分:1)
您可以保持简单并使用NSUserDefaults
。您可以向NSManagedObjectContextWillSave
通知添加观察者。然后,使用NSDate
的{{1}}名称创建/更新NSString
对象。我在Class
:
在应用程序中:didFinishLaunchingWithOptions:
AppDelegate
<强>选择强>
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(mocWillSave:)
name:NSManagedObjectContextWillSaveNotification
object:self.managedObjectContext];
注意:这当然只涉及帐户- (void)mocWillSave:(NSNotification*)note {
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
// Get array of classes that have been updated.
// This way, we don't loop through every updated Object...just the
// unique classes in the updatedObjects set.
NSArray *updatedObjectClasses = [self.managedObjectContext.updatedObjects valueForKeyPath:@"class"];
for (id obj in updatedObjectClasses) {
[userDefaults setObject:[NSDate date] forKey:obj];
}
[userDefaults synchronize];
}
。你当然可以为updatedObjects
做同样的事情。
答案 3 :(得分:1)
我倾向于避免NSUserDefaults
总是感觉像混合苹果和橘子。
当我需要存储这样的信息时,我喜欢把它放在NSPersistentStore
本身的元数据中。这样它就会附加到我正在与Web服务同步的文件中。
NSPersistentStoreCoordinator
上有一些方法允许您访问元数据并对其进行更改。然后,如果文件被移植到另一个设备(比如在恢复或其他设备中),元数据就会随之而来。