2015-05-25 51 views
0

我最近決定將所有的應用程序數據從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中持續時間更長時。接下來,在打印結果的底部重複名稱和類型。我不知道他們爲什麼在那裏。

最後,所有這些地址和其他垃圾在結果數據的側翼是什麼?我不想在那裏,它是如何到達那裏的?

你可能會需要看什麼我有會在這裏,所以我會告訴你,是所涉及的實體: enter image description here

以下是我寫的所有這些對象核心數據:

-(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); 
     } 
    } 
} 

就是這樣,感謝您抽出寶貴的時間遠遠得到這個。如果您需要更多信息,只需發表評論,我會盡快提供。

回答

0

假設您的CXStellarObject對象是NSManagedObject的自定義子類,您需要覆蓋該對象的描述方法並將其寫入以返回有關您的託管對象的格式化信息。

類似這樣的:

- (NSString *)description; { NSMutableString * result = [[NSMutableString alloc] init]; [result appendFormat:@「descriptor =%@ \ n」,self。描述符]; [result appendFormat:@「imageName =%@ \ n」,imageName]; //等等... }

+0

我是個傻瓜,實際上是在NSLog調用中打印描述。這是什麼給了我在控制檯截斷的結果。將'obj.description'改爲'obj.descriptor'(或vs)修復了我的問題。 – Micrified

0

我建議調查覈心數據「故障」。無論何時在描述中看到類似這樣的引用,這是因爲該對象不在內存中,只有該對象的一個​​存根。只要您觸摸對象,Core Data將自動將其拉入內存,然後將顯示完整值。

此外,通常會對長描述調用進行裁剪。如果您想查看完整值,請在調試器中捕獲並通過po進行調用。

相關問題