我在Xcode中创建了我的模型,实体,属性和关系.我的实体的课程是如何创建的?我必须手动创建它们吗?
所以,它终于发生了.发生了任何独立iPhone开发人员的最糟糕情况.升级我的应用程序后,有几个用户报告完全数据丢失.iCloud核心数据同步无法正常工作.我的用户正在部分使用此应用来运行他们的业务.这是一场真正的灾难性失败.
我改变的唯一与iCloud相关的事情是将键值存储添加到iCloud.核心数据代码保持完全相同,模型版本相同(无迁移)等.
在我的测试中,一切都很美妙!但令我沮丧的是,用户报告说,当他们打开更新的应用程序时,他们的数据不再存在.
这可能是什么原因?
请在下面找到我的托管对象模型和持久性存储的代码.如果您还需要其他任何东西来评估问题,请告诉我.
- (NSManagedObjectContext *)managedObjectContext {
if (managedObjectContext_ != nil) {
return managedObjectContext_;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
managedObjectContext_ = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[managedObjectContext_ performBlockAndWait:^{
[managedObjectContext_ setPersistentStoreCoordinator:coordinator];
if (useICloud) {
[managedObjectContext_ setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(mergeiCloud:)
name:NSPersistentStoreDidImportUbiquitousContentChangesNotification
object:coordinator];
}
}];
}
return managedObjectContext_;
}
Run Code Online (Sandbox Code Playgroud)
和
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator_ != nil) {
return persistentStoreCoordinator_;
}
NSMutableDictionary …Run Code Online (Sandbox Code Playgroud) 我有一个NSManagedObjectContext,其中我有许多NSManagedObjects的子类,有些是其他人的容器.我想要做的是观察一个顶级对象,通知它对任何属性,关联或它包含的任何对象的属性/关联的任何更改.
使用上下文的'hasChanges'并没有给我足够的粒度.对象'isUpdated'方法仅适用于给定对象(而不是其关联中的任何对象).是否有一个方便的(也许是基于KVO的)我可以观察上下文中仅限于子图的变化?
属性的这种Transformable数据类型.到底有什么好处呢?有好的例子吗?
我想玩这个.所以经过一段时间的搜索,我发现了这个:NSValueTransformer.似乎是我需要的东西.
那我怎么开始这个呢?例如,如果我想存储一个UIColor对象,我会为它制作一个变换器吗?
究竟是什么东西改变了这种东西?一个NSData?我传递给变压器的物体必须遵循任何协议吗?
我在弄清楚这个核心数据的东西时遇到了一些麻烦.如何创建具有唯一ID的新条目?在SQL中,我只将一个字段声明为自动增量字段.我在这里没有看到类似的东西,但我可能会遗漏一些东西.我只想要一个自动递增的NSInteger字段,所以当我手动将项添加到数据库时,我会有一些形式的引用.
我写了许多与后端通信的iOS应用程序.几乎每次,我都使用HTTP缓存来缓存查询并将响应数据(JSON)解析为Objective-C对象.对于这个新项目,我想知道核心数据方法是否有意义.
这就是我的想法:
iOS客户端向服务器发出请求,并将对象从JSON解析为CoreData模型.
每当我需要一个新对象,而不是直接获取服务器时,我解析CoreData以查看我是否已经发出了该请求.如果该对象存在且尚未过期,则使用获取的对象.
但是,如果对象不存在或已过期(这里将应用某些缓存逻辑),我将从服务器获取对象并相应地更新CoreData.
我认为拥有这样的架构可以帮助实现以下目标:1.避免对后端进行不必要的查询2.允许完全支持离线浏览(您仍然可以使用DataCore的RDBMS进行关系查询)
现在这是我对神的问题:
现在在iOS5中真的这么简单吗?
我以前在AppDelegate中使用此代码执行后台提取:
dispatch_queue_t downloadQueue = dispatch_queue_create("DownloadQueue", NULL);
dispatch_async(downloadQueue, ^{
self.myDownloadClass = [[MyDownloadClass alloc]initInManagedObjectContext:self.managedObjectContext];
[self.myDownloadClass download];
});
dispatch_release(downloadQueue);
Run Code Online (Sandbox Code Playgroud)
我的下载类执行NSURLConnection来获取一些XML数据,使用NSXMLParser来解析数据,然后更新核心数据中的复杂模式.我总是切换到主线程来实际更新核心数据.凌乱的代码,有很多调用dispatch_sync(dispatch_get_main_queue()....
我的新代码如下所示:
NSManagedObjectContext *child = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[child setParentContext:self.managedObjectContext];
[child performBlock:^{
self.myDownloadClass = [[MyDownloadClass alloc]initInManagedObjectContext:child];
[self.myDownloadClass download];
}];
Run Code Online (Sandbox Code Playgroud)
以及我的AppDelegate中的一些其他代码的小改动,以将父模型对象上下文类型设置为NSMainQueueConcurrencyType:
- (NSManagedObjectContext *)managedObjectContext
{
if (__managedObjectContext != nil)
{
return __managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil)
{
__managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[__managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return __managedObjectContext;
}
Run Code Online (Sandbox Code Playgroud)
它似乎工作得很好.整个更新过程仍然在一个单独的线程中运行,但我没有必要创建一个线程.看起来像魔术.
请记住,如果要将更改提交到物理核心数据文件,则还要在父上下文中调用save:.
我这里真的没问过问题.我发布这个以帮助其他人,因为我在搜索新的iOS5托管对象上下文方法时发现的所有内容都只提供了高级别的详细信息而没有代码示例而在后台获取核心数据的所有其他搜索都是旧的,有时候很旧,并讨论如何在iOS5之前做到这一点.
我一直在使用域模型开发一个iphone应用程序,并且推迟了应用程序的持久性方面.核心数据看起来是一个非常好的解决方案,因为我已经有一个定义良好的模型,但我遇到了现有单元测试的障碍.
这是我现在拥有的简单示例:
- (void)test_full_name_returns_correct_string {
Patient *patient = [[Patient alloc] init];
patient.firstName = @"charlie";
patient.lastName = @"chaplin";
STAssertTrue([[patient fullName] isEqualToString:@"charlie chaplin"], @"should have matched full name");
}
Run Code Online (Sandbox Code Playgroud)
一旦我的Patient对象从NSManagedObject扩展并使用@dynamic作为firstName和lastName属性,我该如何才能使这个工作?
还有其他人使用Core Data遇到过这种类型吗?谢谢.
由于CoreData已经可以在OS 3.0中用于iPhone,它是否意味着数据持久性的答案并取代所有直接需求SQLite?
还有什么理由可以使用SQLite?什么是SQLitevs.的优点/缺点CoreData?
我有一个托管对象("A"),它包含各种属性和关系类型,它的关系也有自己的属性和关系.我想做的是"复制"或"复制"以对象"A"为根的整个对象图,从而创建一个与"A"非常相似的新对象"B".
更具体地说,"B"(或其子代)所包含的关系都不应指向与"A"相关的对象.应该有一个完全相同的关系完整的新对象图,所有对象具有相同的属性,但当然不同的id.
有一种明显的手动方式可以做到这一点,但我希望了解一种更简单的方法,这在核心数据文档中并不完全明显.
TIA!
core-data ×10
iphone ×5
ios ×4
architecture ×1
cocoa ×1
cocoa-touch ×1
icloud ×1
ios5 ×1
objective-c ×1
sqlite ×1
unit-testing ×1