2010-08-25 42 views
0

我想將核心數據添加到現有的應用程序,這是不容易的考慮到所有的文檔和每個教程開始創建一個應用程序,使用核心數據開始。所以我試圖將現有的模型類轉換爲核心數據實體。以下是我所做的:核心數據:NSManagedObjectContext保存與無法識別的選擇器崩潰

  1. 添加核心數據框架。
  2. 添加一個xcdatamodel文件。它向我展示了一個可以添加現有類的對話框,因此我添加了模型。然後我調整了屬性,並告訴它屬於哪些類型。
  3. 而不是生成一個新的模型類(因爲我已經有一個),我創建了一個測試項目,看看它會是什麼樣子,並調整我的類匹配。這包括將其更改爲從NSManagedObject繼承,改變我的屬性,以動態,消除呼籲釋放等
  4. 新增的核心數據對象到我的應用程序委託,下面this example.
  5. 在我的ViewController,我曾經的Alloc我模式,我把它改成

    MyModel *model = (MyModel*)[NSEntityDescription insertNewObjectForEntityForName:@"MyModel"] inManagedObjectContext:[delegate managedObjectContext]; 
    

注意該委託是我的應用程序委託的引用,之前聲明。也許這不是做這件事的明智之舉。

設置的所有屬性後,我有:

[[delegate managedObjectContext] save:&error]; 

此行崩潰,並回溯說,這是裏面[NSSqlLiteConnection execute],保存功能內約8個級別。例外情況是:

*-[NSConcreteValue UTF8String]: unrecognized selector sent to instance* 

這是什麼具體的價值?爲什麼這被稱爲誰?如果它很重要,我的模型創建/保存代碼是一個函數,這是一個NSNotification的回調函數。那是在一個單獨的線程?我聽說managedObjectContext不是線程安全的。但我沒有得到我期望的那種錯誤。

+0

這只是一個猜測,但是您可能更改了模型中某個屬性或關係的名稱,並且生成的對象仍使用舊名稱?因此,它試圖在僅具有「getMyOldAttribute」的類上執行「getMyNewAttribute」。 – samkass 2010-08-25 20:29:00

回答

2

嗯,我敢肯定你的數據庫模型(.xcdatamodel)上聲明爲NSString的屬性在你的對象模型中被聲明爲別的東西(可能是NSNumber)。編譯代碼時,不會生成任何警告,但當CoreData嘗試保存moc(即:將數據寫入持久性存儲庫,AKA SQLite數據庫)時,它會在CoreData嘗試將您所設想的NSString轉換爲UTF8編碼時失敗。

您應該仔細檢查數據庫模型和對象模型上的屬性。

+0

賓果。當我創建實體時,它會從類中導入所有內容,包括CLLocationCoordinate2D。我在模型中擺脫了這一切,一切都奏效了。 – Tesserex 2010-08-25 22:24:28

相關問題