2009-05-31 109 views
0

我有一個方法讀取xml文件並將xml節點存儲在NSArray調用的*節點中的某個XPath路徑中。我想要做的是獲取數組中的每一項,並將其添加到名爲Category的具有「name」屬性的核心數據實體中。NSArray到核心數據項

我已經嘗試了多種不同的創建實體的方法,但我不確定有效執行此操作的正確方法。這是用於創建NSArray的代碼,關於如何實現這個的任何想法? (忽略NSError,我會在最終版本中解決這個問題)

- (IBAction)readCategories:(id)sender 

{

NSString *xmlString = [resultView string]; 

NSData *xmlData = [xmlString dataUsingEncoding: NSASCIIStringEncoding]; 

NSXMLDocument *xmlDoc = [[NSXMLDocument alloc] initWithData:xmlData options:nil error:nil]; 

//XPath 

NSError *err=nil; 

NSArray *nodes = [xmlDoc nodesForXPath:@"//member[name='description']/value/string" error:&err]; 

}

編輯 - 我的循環代碼

NSArray *nodes = [xmlDoc nodesForXPath:@"//member[name='description']/value/string" error:&err]; 
int arrayCount = [nodes count]; 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
NSXMLElement *categoryEl; 
NSString *new = [catArrayController newObject]; 
int i; 
for (i = 0; i < arrayCount; i++) 
{ 
    [categoryEl = [nodes objectAtIndex:i]]; 
    [new setValue:[categoryEl stringValue] forKey:@"name"]; 
    [catArrayController addObject:new]; 
} 
[pool release]; 

回答

2

以下是我會寫:

for (NSXMLElement *categoryElement in nodes) { 
    NSManagedObject *newObject = [catArrayController newObject]; 
    [newObject setValue:[categoryElement stringValue] forKey:@"name"]; 
    [catArrayController addObject:newObject]; 
    [newObject release]; 
} 

首先,我使用的Objective-C 2.0的for-each語法。這比使用索引變量更簡單。我取消了iarrayCount

接下來,我拿出你的NSAutoreleasePool。循環中沒有任何對象是自動釋放的,所以它沒有任何作用。 (newObject方法返回一個保留的對象,按照慣例,這個保留的對象的名字是new)這也是我在將它添加到數組控制器後釋放newObject的原因。由於我不打算在這種方法中再使用它,我需要釋放它。

此外,您已將new(我將其更名爲newObject)定義爲NSString。核心數據對象始終是NSManagedObject的實例或NSManagedObject的子類。

您的行[categoryEl = [nodes objectAtIndex:i]]不會編譯。這是因爲括號語法用於向對象發送消息。這是一個賦值語句,所以在這裏不需要括號語法。 (因爲我已經改變循環以使用for-each語法,所以這條線也不再是必要的)但是,爲了將來的參考,categoryEl = [nodes objectAtIndex:i];本來可以工作。

1

哪一部分是你有麻煩?除了循環訪問數組,爲每個條目創建一個新的託管對象並設置正確的屬性之外,應該不會有太多的事情要做。您可以使用NSEntityDescription的-insertNewObjectForEntityForName:inManagedObjectContext:方法創建管理對象。

+0

在我的測試中,我放棄了核心數據,以便我可以學會循環訪問數組。我用新的數組代碼更新了我的問題,但它不起作用。什麼是循環訪問數組並將其添加到實體的最佳方式? – 2009-05-31 08:13:20