2012-07-20 117 views
2

我已經讀過,這工作,但我無法得到它。我想預先填充核心數據。我運行我的項目,所以它會創建sqlite文件。我將它複製到桌面上,然後使用命令行sqlite3預填充它。我運行了查詢以確保它正確填充。所以現在我重新將它添加到我的項目中。不管我做什麼,它都不會獲取數據。預填充核心數據通過從文檔複製.sqlite文件

我得到它的工作一次。在模擬器中運行後,我從項目的文檔文件夾中重新複製sqlite文件。然後我填充這個新的sqlite文件。我把它放回到我的項目中,並且顯示了內容。

我認爲問題是Z_METADATA表。該表具有Z_UUID屬性。我認爲唯一的工作時間是模擬器的UUID和sqlite的Z_UUID屬性相同。

我進入〜/ Library/Developer/Xcode/DerivedData並刪除了DerivedData文件夾的內容。所以現在我的模擬器在運行時會有不同的UUID。我這樣做了,現在sqlite文件的內容將不會顯示。這就是我認爲Z_METADATA表是問題的原因。 Z_METADATA的UUID和我的模擬器的UUID不一樣,因此某些原因它不能使用它?

所有關於預填充核心數據的文章,我發現這些都是舊的,大概在2009年左右,所以我不認爲這是一個問題。那麼我可以使用這種複製sqlite文件的方法,使用命令行預先填充它,然後重新將它添加到項目中?有沒有人有最新的方式預先核心數據?

所以錯誤是我的NSFetchedResultsController返回了0個對象的計數。我得到它返回我上面提到的一次所有的數據。

+0

你確定你有相同的DataModels嗎?發生了什麼錯誤? – 2012-07-20 19:49:42

+0

是的。我創建了數據模型,運行了應用程序,然後複製了sqlite文件,所以它是相同的模型。錯誤只是我的NSFetchedResultsController返回0個對象。就像我說的那樣,我得到它一次返回數據庫中的所有對象。 – Ryan 2012-07-20 23:22:14

+0

查看[WWDC 2012視頻](https://developer.apple.com/videos/wwdc/2012/),特別是會話227和相關示例代碼(也在視頻網站上)。這是關於在iCloud上使用Core Data,但即使你沒有在做iCloud,也值得看看他們的方法來預先填充數據庫。除了複製文件外,您還可以擁有由兩個獨立存儲支持的持久存儲協調器:Documents /目錄中的讀/寫存儲協調器,以及應用程序包中的只讀存儲協調器。 – rickster 2012-07-20 23:41:17

回答

1

按照Core Data Programming Guide

重要雖然核心數據支持SQLite作爲一個存儲類型,店裏格式像其他本地核心數據的存儲,是私人的。您無法使用本機SQLite API創建SQLite數據庫,並直接將其與Core Data一起使用(您也不應該使用本機SQLite API來操作現有的Core Data SQLite存儲)。如果您有現有的SQLite數據庫,則需要將其導入Core Data存儲區(請參閱「有效導入數據」)。

雖然我確定有人反向設計了Core Data sqlite格式,但Apple不提供任何文檔,並且可能會跨主要OS版本進行更改。

編寫一個使用Core Data進行導入的命令行應用程序。

+0

太棒了。我會在星期一檢查一下,並告訴你是否可以導入它。謝謝。 – Ryan 2012-07-21 15:05:01

+0

感謝命令行應用程序工作。所以人們知道......創建一個新的Mac'命令行工具'項目。我有一個製表符分隔的文本文件,然後使用Core Data API來填充Core Data。然後我將創建的sqlite文件複製到我的iOS項目中。在iOS項目中,確保將sqlite文件的名稱更改爲您在AppDelegate中導入的名稱,並確保數據模型相同。 – Ryan 2012-07-23 15:25:16

+0

我是在iOS 4.0上完成的,它直到現在還在iOS 6.0中工作,而沒有改變它。但是你是對的,它不應該這樣工作。我創建了一個空的商店,並用SQL工具將其填充到外部,然後核心數據加載了預填充的所有內容。如果你想手動創建它(我也這樣做了,創建了表等),那麼你只需要從一個像sqlite那樣構建的模型創建的空文件的UUID。到現在爲止,我無法弄清楚如何在覈心數據之外生成這個UUID。 – Binarian 2012-12-03 16:44:10

相關問題