如何以编程方式加载/保存核心数据模型?

时间:2013-11-24 12:34:04

标签: objective-c core-data

我尝试加载并保存我的数据模型,目前仅用于测试用例,但这也可能会引起人们的兴趣。

我可以创建一个核心数据模型,我可以创建对象等。我甚至找到了一种保存的方法(这是正确的方法???)并且我让程序加载它。但那么registeredObject计数是0.有人理解吗?

//not part of the snippet here is the setup of some objects, etc. 
//mdoc is the NSPersistentDocument instance (to be precise KKDocument instance which 
//extends NSPersistentDocument)

XCTAssertTrue([[mdoc.managedObjectContext registeredObjects] count] == 5);

//save the document, note that kkFileType is the UTI-string for my model which is conform to public.xml
NSError * error;
NSURL *modelURL = [NSURL fileURLWithPath:@"testData.vith" isDirectory:FALSE];
NSLog(@"save url %@",modelURL.absoluteString);
[mdoc saveToURL:modelURL ofType:kkFileType forSaveOperation:NSSaveOperation completionHandler:^(NSError *errorOrNil){
      NSLog(@"error saving %@",errorOrNil);
}];

//load data into second document
KKDocument *second = [[KKDocument alloc] init];
XCTAssertTrue([second readFromURL:modelURL ofType:kkFileType  error:&error],@"error: %@",error);

//check that structure is provided
XCTAssertTrue(second.managedObjectContext != nil,"managedObjectContext missing");
XCTAssertTrue([second.managedObjectContext registeredObjects] != nil,"no registered Objects?");

//this test fails with message "instead 0"
XCTAssertTrue([[second.managedObjectContext registeredObjects] count] == 5, "instead %d", [[second.managedObjectContext registeredObjects] count]);

测试用例很好地执行,只有最后一次测试失败,计数为0.两者之间生成的XML文件看起来也很好。

  1. 我是否需要先获取对象?或者还有什么问题?
  2. 我是否甚至使用正确的方法将核心数据模型保存到XML文件中并从中加载?我需要处理NSPersistentStoreCoordinator吗?
  3. 非常感谢提前!

1 个答案:

答案 0 :(得分:1)

registeredObjects将报告上下文“知道”的对象数量,这与“商店中的对象数量”不同。如果您想要计算商店中的所有对象,则需要查询该商店。 (即执行取指等)

一般情况下,是的,如果你想持久化对象(也就是加载或保存它们),你将需要使用NSPersistentStoreCoordinator,而不管商店类型如何。即使是内存商店也需要NSPersistentStoreCoordinator

在您的特定情况下,我希望NSPersistentDocument可以为您处理NSPersistentStoreCoordinator。我认为你的主要问题是对registeredObjects的含义的误解。