1. 程式人生 > >操作CoreData 常見的錯誤及解決方法

操作CoreData 常見的錯誤及解決方法

. 使用Core Data時Model Class的定義:

  • property必須是Objective C的物件型別,必須宣告為nonatomic & retain或 nonatomic ©
  • 在.m檔案中accessor方法用@dynamic, refenrence裡面是strongly recommend這樣用的
  • 如果property是數字,用NSNumber *,呼叫的時候再換成需要的型別。
    • 例如 cell.text = [NSNumber stringValue: (NSNumber *)];

2. 修改.xcdatamodel檔案引起的Exception

  • 如果在程式已經執行過的情況下更改了.xcdatamodel檔案,原有資料庫就作廢了,所以無論怎麼除錯都會出現exception。一般console裡面會提示NSPersistentStoreCoordinator has no persistent stores.
  • 解決方法:找到.sqlite,然後刪掉,重新執行。.sqlite檔案在Library/Application
    Support/iPhone Simulator/User/Applications/(一堆數字,點進去會看見project名)/Documents/

3. 所有跟text有關的UI類的setText方法只能用NSString,否則會有warning,如果不管這個warning執行時會exception.

4. 如何除錯EXE_BAD_ACCESS

5. unrecognized selector sent to instance xxxx

  • 造成unrecognized selector sent to instance iphone,大部分情況下是因為物件
    被提前release了,在你心裡不希望他release的情況下,指標還在,物件已經不在了。很多時候,是因為init初始化函式中,對屬性賦值沒有使用self.foo賦值,而是直接對foo賦值,導致屬性物件沒有retain(心裡以為retain了),而提前釋放。有時候也能是初始化函式用錯了。
  • 解決方法:檢查release和init

6. Can’t merge models with two different entities named xxxx

  • 修改了Core Data的資料模型後,因為版本問題出現的Exception
  • 解決辦法:Build —>clear all target

7. could not locate an NSManagedObjectModel for entity name

  • managedObjectContext沒有初始化,所以無法讀取model的值
  • 除錯方法:將appDelegate的context傳給viewController前,要將viewController的context初始化,囧囧是寫在initWithNibName裡的 

8.UITableView的資料來源排序為降序時,記得CellForRowAtIndexPath裡面不要用if(Cell ==nil)的條件去掉,否則資料更新會錯。。。

9.  使用Core Data時,實體類的relationship在fetch的時候只作為fault被呼叫

fault是為了保證模型完整的一種東西,比如說A有個relationship ,這個關係的目標是B,那fetch A的時候,B只是個fault,你是無法訪問B的屬性的,因為B根本沒被fetch ,下面是囧囧的解決方法,也不知道對不對,哈哈哈哈- - 

 [fetchRequest setReturnsObjectsAsFaults:NO];