我最近決定將所有的應用程序數據從plist移動到Core Data。這很簡單。我有一個有幾個屬性的課,我會閱讀我所有的plist信息來使用字典。這是通過創建具有相同確切屬性的實體來模擬的。然後,我將plist信息加載到數組中,並將它們全部解析,編寫並將新實體保存到核心數據。從核心數據中檢索實體:打印屬性給我提供了不完整/不想要的結果?
聽起來不錯嗎?那麼,我曾這麼想過。但是,現在我正在閱讀它,我注意到了一些問題。
原因之一,當我繼續前進,嘗試打印了我的對象的屬性如下:
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;
})
原因之一,我的描述是不甚至完成。它在「從o」切斷,當它實際上在plist中持續時間更長時。接下來,在打印結果的底部重複名稱和類型。我不知道他們爲什麼在那裏。
最後,所有這些地址和其他垃圾在結果數據的側翼是什麼?我不想在那裏,它是如何到達那裏的?
你可能會需要看什麼我有會在這裏,所以我會告訴你,是所涉及的實體:
以下是我寫的所有這些對象核心數據:
-(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];
}
最後我如何提取它們,並在THI s的會有點歪(別擔心,這不是一個複雜的方法)
-(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);
}
}
}
就是這樣,感謝您抽出寶貴的時間遠遠得到這個。如果您需要更多信息,只需發表評論,我會盡快提供。
我是個傻瓜,實際上是在NSLog調用中打印描述。這是什麼給了我在控制檯截斷的結果。將'obj.description'改爲'obj.descriptor'(或vs)修復了我的問題。 – Micrified