我最近决定将所有应用程序数据从plist转移到Core Data。这非常简单。我有一个有几个属性的类我会阅读所有的plist信息使用字典。这是通过创建具有相同确切属性的实体来模仿的。然后我将plist信息加载到Arrays中,并将它们全部解析,编写并将新实体保存到核心数据中。
听起来不错?好吧,我想是这样的。但是,现在我已经把它全部读回去了,我注意到了一些问题。
首先,当我继续尝试打印我的对象的属性时,如下所示:
for (CXStellarObject *obj in self.starsArray)
{
NSLog(@"Type: %@\n Language: %@\n Name: %@\n ImageName: %@\n Description: %@\n",obj.type,obj.language.label,obj.name,obj.imageName,obj.description);
}
我明白了:
Type: star
Language: (null)
Name: Sirius
ImageName:
Description: <CXStellarObject: 0x7fbb0a58d5d0> (entity: CXStellarObject; id: 0xd000000000140000 <x-coredata://9E3F584C-3214-4A6A-B55A-B63D066A152B/CXStellarObject/p5> ; data: {
descriptor = "The brighest star visible from Earth, Sirius (Also known as Sirius A, or the Dog Star), is a bright white dwarf. It is part of the Canis Major Constellation. It is approximately 8.6 light years from o";
imageName = "";
language = "0xd000000000040002 <x-coredata://9E3F584C-3214-4A6A-B55A-B63D066A152B/CXLocalizationAsset/p1>";
name = Sirius;
type = star;
})
首先,我的描述甚至还没有完成。当它实际上在plist中持续更长时间时,它会从o&#34;切断。接下来,在打印结果的底部重复名称和类型。我不知道他们为什么会在那里。
最后,结果数据的所有这些地址和其他垃圾是什么?我不想那里,它是怎么到达那里的?
您可能需要查看我在这里发生的事情,因此我将向您展示所涉及的实体:
以下是我将所有这些对象写入Core Data的方法:
-(void)writeAllArraysToCoreData
{
NSArray *starsArray = [self starsArray];
NSArray *planetsArray = [self planetsArray];
NSArray *moonsArray = [self moonsArray];
NSArray *allData = @[starsArray,planetsArray,moonsArray];
for (NSArray *array in allData)
{
for (NSDictionary *dict in array)
{
[self archieveCXStellarObjectWithLanguage:[dict valueForKey:@"Language"] Type:[dict valueForKey:@"Type"] Name:[dict valueForKey:@"Name"] ImageName:[dict valueForKey:@"ImageName"] Descriptor:[dict valueForKey:@"Description"]];
}
}
}
最后,我在这里调用的方法是:
-(void)archieveCXStellarObjectWithLanguage:(NSString *)languageCode Type:(NSString *)type Name:(NSString *)name ImageName:(NSString *)imageName Descriptor:(NSString *)descriptor
{
CXStellarObject *object = [NSEntityDescription insertNewObjectForEntityForName:@"CXStellarObject" inManagedObjectContext:self.managedObjectContext];
[object setLanguage:[self.supportedLanguageAssets valueForKey:languageCode]];
[object setType:type];
[object setName:name];
[object setImageName:imageName];
[object setDescriptor:descriptor];
// Add New Object to All Objects Array
[self.allStoredObjects addObject:object];
// Save Changes
[self saveContext];
}
最后我如何提取它们,以及这有点不合适(不要担心,这不是一个复杂的方法)
-(void)loadData
{
if (!self.allStoredObjects)
{
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"CXStellarObject" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
NSError *error;
NSArray *fetchResults = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (!fetchResults)
{
[NSException raise:@"Fetch Failed!" format:@"Reason: %@",[error localizedDescription]];
}
[self setAllStoredObjects:[NSMutableArray arrayWithArray:fetchResults]];
// Filter Arrays
NSPredicate *starPredicate = [NSPredicate predicateWithFormat:@"SELF.type == 'star'"];
[self setStarsArray:[fetchResults filteredArrayUsingPredicate:starPredicate]];
for (CXStellarObject *obj in self.starsArray)
{
NSLog(@"Type: %@\n Language: %@\n Name: %@\n ImageName: %@\n Description: %@\n",obj.type,nil,obj.name,obj.imageName,obj.description);
}
}
}
就是这样,感谢您抽出宝贵的时间来实现这一目标。如果您需要我提供更多信息,请发表评论,我会尽快提出。
答案 0 :(得分:0)
我建议调查核心数据“故障”。每当你在描述中看到类似的引用时,因为对象不在内存中,只有对象的存根。一旦触摸对象,Core Data就会自动将其拉入内存,然后显示完整的值。
此外,通常会对长描述调用进行剪裁。如果要查看完整值,请在调试器中捕获它并通过po
调用它。
答案 1 :(得分:0)
假设您的CXStellarObject对象是NSManagedObject的自定义子类,您需要覆盖该对象的描述方法并将其写入以返回有关您的托管对象的格式化信息。
这样的事情:
- (NSString *)说明; { NSMutableString * result = [[NSMutableString alloc] init]; [结果appendFormat:@&#34; descriptor =%@ \ n&#34;,self.descriptor]; [结果appendFormat:@&#34; imageName =%@ \ n&#34;,imageName]; //等等... }