2014-04-03 49 views
0

0我試圖在我的應用第一次運行時用數組預先加載核心數據。在viewDidLoad中,它檢查覈心數據是否爲空。如果是,它調用一個方法來加載一個數組的核心數據。我的問題是,當我檢查覈心數據的內容時(使用Core Data Pro Readonly),核心數據的內容中有一項:「NULL」。這是我認爲加載數組核心數據這是給我的問題的關鍵線路:將數組預加載到核心數據中

newArray = [elementsArray objectAtIndex:0]; 

核心數據實體被稱爲「元素」,並有一個屬性「的ElementName」。 這是整個方法的內容:

-(void)loadElementsEntity { 
NSLog(@"LOADING ELEMENTS INTO CORE DATA"); 

NSMutableArray *elementsArray = [[NSMutableArray alloc]init]; 
// LOAD THE DATA INTO THE ARRAY 
elementsArray = [[NSMutableArray alloc] initWithObjects: 
       @"Wall", 
       @"Floor", 
       @"Ceiling", 
       @"Door", 
       @"Window", 
       @"Roof", 
       @"Electrical", 
       @"", 
       @"* New Element *", nil]; 

// LOAD THE ARRAY INTO CORE DATA: ELEMENTS ENTITY 
AppDelegate *aDel = [[UIApplication sharedApplication]delegate]; 
NSManagedObjectContext *moc = [aDel managedObjectContext]; 
NSManagedObject *newArray; 
newArray = [NSEntityDescription insertNewObjectForEntityForName:@"Elements" inManagedObjectContext:moc]; 

newArray = [elementsArray objectAtIndex:0]; 

NSError *error = nil; 
if (![moc save:&error]) { //SAVE FAILED 
    NSLog(@"YOUR SAVE FAILED! %@", [error localizedDescription]); 
} else { 
    NSLog(@"YOUR SAVE SUCCEEDED."); 
} 

// CHECK TO SEE IF CORE DATA WAS LOADED 
NSLog(@"LISTING THE ARRAY"); 
NSFetchRequest *request = [[NSFetchRequest alloc]init]; 
[request setEntity:[NSEntityDescription entityForName:@"Elements" inManagedObjectContext:moc]]; 
NSArray *testArray = [self.managedObjectContext executeFetchRequest:request error:&error]; 
NSLog(@"ELEMENTSARRAY COUNT: %d", [elementsArray count]); 
NSLog(@"LOADED TESTARRAY: count = %d", [testArray count]); 

} 

任何人都可以指出我要去的地方錯在這裏?


我已經使用for語句更新了方法的保存部分,如下所示。
但它仍然在覈心數據中產生一個NULL條目!

請幫忙!

// LOAD THE ARRAY INTO CORE DATA ELEMENTS 
AppDelegate *aDel = [[UIApplication sharedApplication]delegate]; 
NSManagedObjectContext *moc = [aDel managedObjectContext]; 
NSManagedObject *newString = [NSEntityDescription insertNewObjectForEntityForName:@"Elements" inManagedObjectContext:moc]; 
NSError *error = nil; 

for (NSString *elementname in elementsArray) { 
    NSLog(@"NAME= %@", elementname); 
    [newString setValue:elementname forKey:@"elementName"]; 
    if (![moc save:&error]) { //SAVE FAILED 
     NSLog(@"YOUR SAVE FAILED! %@", [error localizedDescription]); 
    } else { 
     NSLog(@"SAVE SUCCEEDED."); 
    } 
} 
+0

你試圖設置您建設部@「樓」,這是不是唯一的錯誤。首先儘量不要將其保存爲數組。 – BoranA

+0

請不要將它保存爲數組?我不遵循你的意思。 – Jupiter869

+0

數組中的每個元素必須是元素表中的一行。你需要迭代並保存它們。 – BoranA

回答

0

這是有點長了一個註解,因此這裏是答案。

  1. 是的,你不應該把它保存爲一個數組。它會保存NULL,因爲您試圖保存不受支持的文件類型。您應該單獨將字符串保存在該數組中。

//將數組轉換成核心數據元素

AppDelegate *aDel = [[UIApplication sharedApplication]delegate]; 
NSManagedObjectContext *moc = [aDel managedObjectContext]; 
NSError *error = nil; 

for (NSString *elementname in elementsArray) { 
    NSManagedObject *element = [NSEntityDescription insertNewObjectForEntityForName:@"Elements" inManagedObjectContext:moc]; 
    element.title = elementname; //your attribute name instead title and it must be string 
} 

if (![moc save:&error]) { //SAVE FAILED 
    NSLog(@"YOUR SAVE FAILED! %@", [error localizedDescription]); 
} else { 
    NSLog(@"SAVE SUCCEEDED."); 
} 
0

這條線:

newArray = [NSEntityDescription insertNewObjectForEntityForName:@"Elements" inManagedObjectContext:moc]; 

正在創造一個新的,空的,實體實例。然後,您立即執行:

newArray = [elementsArray objectAtIndex:0]; 

它用一個字符串替換您對新實體實例的引用。所以,當上下文被保存時,你將會有一個空對象。

你應該做的是迭代elementsArray的內容,並在每次迭代中創建一個新的實體實例,然後使用該索引處的數組內容來配置新的實體實例。


for (NSString *elementName in elementsArray) { 

    // create a new entity instance 
    NSManagedObject *newString = [NSEntityDescription insertNewObjectForEntityForName:@"Elements" inManagedObjectContext:moc]; 

    // configure using 'name' 
    [newString setValue:elementName forKey:@"elementName"]; 
} 

NSError *error = nil; 
NSLog(@"LOADING: %@", newString); 

if (![moc save:&error]) { //SAVE FAILED 
    NSLog(@"YOUR SAVE FAILED! %@", [error localizedDescription]); 
} else { 
    NSLog(@"SAVE SUCCEEDED."); 
} 
+0

我現在看到你的意思是重寫newArray行。但是,我如何迭代elementsArray的內容?我不確定那是什麼意思。 – Jupiter869

+0

啊,你只是說要使用for語句!嘿,謝謝!我想這樣做,但不會只爲elementsArray中的每個項目重新創建相同的實體? – Jupiter869

+0

正如我擔心的那樣,迭代時仍然會得到一個NULL語句(使用for循環)。如果您喜歡借閱您的意見,請參閱上面的附加代碼。 – Jupiter869