2011-04-01 387 views
18

這是我第一次使用核心數據,並且出現以下錯誤。核心數據;可可錯誤134100

如果你能告訴我如何解決它,我將非常感激。

Unresolved error Error Domain=NSCocoaErrorDomain Code=134100 "The operation couldn’t be completed. (Cocoa error 134100.)" UserInfo=0x5927880 {metadata=<CFBasicHash 0x59269a0 [0x1007400]>{type = immutable dict, count = 7, 
entries => 
    2 : <CFString 0x5926e10 [0x1007400]>{contents = "NSStoreModelVersionIdentifiers"} = <CFArray 0x5927240 [0x1007400]>{type = immutable, count = 0, values =()} 
    4 : <CFString 0x5927190 [0x1007400]>{contents = "NSPersistenceFrameworkVersion"} = <CFNumber 0x5926ca0 [0x1007400]>{value = +320, type = kCFNumberSInt64Type} 
    6 : <CFString 0x59271c0 [0x1007400]>{contents = "NSStoreModelVersionHashes"} = <CFBasicHash 0x5927340 [0x1007400]>{type = immutable dict, count = 2, 
entries => 
    0 : <CFString 0x5927280 [0x1007400]>{contents = "Details"} = <CFData 0x59272f0 [0x1007400]>{length = 32, capacity = 32, bytes = 0x434e180241ecf461e59580e640ff926b ... aa456d1410ed9d1b} 
    2 : <CFString 0x5927260 [0x1007400]>{contents = "History"} = <CFData 0x59272a0 [0x1007400]>{length = 32, capacity = 32, bytes = 0x3437f77a5563363f66b9d72ea76e0ff1 ... be194eb9dd17cddc} 
} 

    7 : <CFString 0xe238b0 [0x1007400]>{contents = "NSStoreUUID"} = <CFString 0x5926fc0 [0x1007400]>{contents = "6C5FECCB-0B64-46EB-809B-E0A4577D1E90"} 
    8 : <CFString 0xe23720 [0x1007400]>{contents = "NSStoreType"} = <CFString 0xe238f0 [0x1007400]>{contents = "SQLite"} 
    9 : <CFString 0x59271f0 [0x1007400]>{contents = "NSStoreModelVersionHashesVersion"} = <CFNumber 0x4d13e20 [0x1007400]>{value = +3, type = kCFNumberSInt32Type} 
    10 : <CFString 0x5927220 [0x1007400]>{contents = "_NSAutoVacuumLevel"} = <CFString 0x5927380 [0x1007400]>{contents = "2"} 
} 
, reason=The model used to open the store is incompatible with the one used to create the store}, { 
    metadata =  { 
     NSPersistenceFrameworkVersion = 320; 
     NSStoreModelVersionHashes =   { 
      Details = <434e1802 41ecf461 e59580e6 40ff926b 20004ce9 58eb965f aa456d14 10ed9d1b>; 
      History = <3437f77a 5563363f 66b9d72e a76e0ff1 ed7f70fd cb7035e9 be194eb9 dd17cddc>; 
     }; 
     NSStoreModelVersionHashesVersion = 3; 
     NSStoreModelVersionIdentifiers =   (
     ); 
     NSStoreType = SQLite; 
     NSStoreUUID = "6C5FECCB-0B64-46EB-809B-E0A4577D1E90"; 
     "_NSAutoVacuumLevel" = 2; 
    }; 
    reason = "The model used to open the store is incompatible with the one used to create the store"; 
} 
sharedlibrary apply-load-rules all 
Current language: auto; currently objective-c 
kill 
quit 
Program ended with exit code: 0 

我的代碼是在這裏: https://gist.github.com/898579

回答

60

這裏的原因:

The model used to open the store is incompatible with the one used to create the store 

而且這裏是你如何做到了:

  1. 你創造了一些實體的某些屬性,寫了一些代碼
  2. 推出的應用程序,可能添加了一些內容
  3. 退出應用程序,並添加/更改一些實體屬性
  4. 你可能會再次啓動了程序,現在它給你的錯誤

這樣做的原因是因爲您的新託管對象模型試圖使用較舊版本的存儲(首次啓動應用時創建的那個版本)。

快速和骯髒的修復將刪除存儲文件(〜/庫/應用程序支持/ YOUR_APP /中的某處)並再次啓動您的應用程序。

供將來參考 - 如果您發佈應用程序,並且在下一版本中應用程序已更改託管對象模型 - 您必須爲其編寫遷移。蘋果文檔中的核心數據編程菜譜涵蓋了所有這些和更多內容。

+2

我在一個由兩人組成的團隊中工作 - 當我們其中一個人安裝到手機上,其中的應用程序先前已安裝到另一個手機中時,我們得到此錯誤。數據模型/結構沒有改變。這與簽名應用程序的用戶身份有關嗎? – Marc 2012-05-15 10:34:55

+0

不知道那個。它可能會受到應用程序的GUID的影響。 – Eimantas 2012-05-15 10:40:22

+0

奇怪 - 我們使用SVN作爲版本控制。我擔心如果另一個開發人員在我之後接管應用程序,他們可能會在這次崩潰時將應用程序發佈到應用商店。如果我找出它發生的原因,將會保持這個線程。 – Marc 2012-05-16 08:11:04

14

如果您從模擬器/設備中刪除應用程序,這應該足夠了。

您不必更改項目中的文件(除了選擇當前模型並使用菜單替換類:編輯器/創建NSManaged對象子類)。

1

有時您需要從另一個應用程序創建的商店加載數據 - 例如,一個應用程序只用於從外部來源加載數據並保存到商店中,其他應用程序則使用這個存儲區充滿數據作爲起點。

我不想說它是超級正確的,但如果您在應用程序開發過程中不時需要它:只需將商店中的UUID(通過SQLVue等)更改爲正確的那個預計由您的應用程序。您會在名爲Z_UUID的唯一列中的大多數情況下稱爲ZMETADATA的表中找到UUID。但請記住 - 僅用於快速調試/開發目的。不要以編程方式使用它。

+0

我該如何以編程方式進行此操作,例如當我複製了UIManagedDocument並且想要使用它的副本時? – AlexR 2013-07-07 15:42:15

2

你應該做以下步驟

  1. 刪除應用程序,然後再次運行它,如果它仍然顯示了同樣的錯誤。那就意味着你使用了不同類型的特定屬性/屬性。
  2. 轉到您的.xcdatamodeled文件並檢查每個屬性的類型。
  3. 轉到您的代碼並檢查,在覈心數據中插入屬性/對象時,您使用了相同類型的不同。所以,重點是代碼中的屬性/對象的類型(NSString,NSDate ...)和.xcdatamodeled應該是相同的。如果不是那麼它會給出錯誤「錯誤域= NSCocoaErrorDomain代碼= 134100」
1

如果您在開發模式,並且不想每次更改實體時刪除應用程序,我建議使用此解決方案:

- (void)removeCoreDataStorage { 
    // Where does the SQLite file go? 
    NSArray *documentDirectories = 
    NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
             NSUserDomainMask, 
             YES); 
    // Get one and only document directory from that list 
    NSString *documentDirectory = [documentDirectories firstObject]; 
    NSString *path = [documentDirectory stringByAppendingPathComponent:@"model.sqlite"]; 

    NSError *error = nil; 
    NSURL *storeURL = [NSURL fileURLWithPath:path]; 

    NSURL *storeURLWal = [NSURL URLWithString:[storeURL.absoluteString stringByReplacingOccurrencesOfString:@".sqlite" withString:@".sqlite-wal"]]; 
    NSURL *storeURLShm = [NSURL URLWithString:[storeURL.absoluteString stringByReplacingOccurrencesOfString:@".sqlite" withString:@".sqlite-shm"]]; 

    BOOL isRemoveItemAtURL = [[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error]; 
    if (isRemoveItemAtURL == NO) { 
     NSLog(@"NO RemoveItemAtURL. Reason: %@", error.localizedFailureReason); 
    } 

    BOOL isRemoveItemAtURLWal = [[NSFileManager defaultManager] removeItemAtURL:storeURLWal error:&error]; 
    if (isRemoveItemAtURLWal == NO) { 
     NSLog(@"NO RemoveItemAtURL. Reason: %@", error.localizedFailureReason); 
    } 

    BOOL isRemoveItemAtURLShm = [[NSFileManager defaultManager] removeItemAtURL:storeURLShm error:&error]; 
    if (isRemoveItemAtURLShm == NO) { 
     NSLog(@"NO RemoveItemAtURL. Reason: %@", error.localizedFailureReason); 
    } 
} 

不要忘了用自己的路徑更改path

+0

將iOS從10.3升級到10.3.2後出現問題。這有助於解決問題。謝謝! – 2017-06-18 12:49:47