2012-04-30 67 views
1

我正在構建一個項目,我需要使用現有數據預先填充coredata數據庫。iOS CoreData - 使用現有索引預填充數據庫

我構建了一個解析器來創建iOS模擬器中的sqlite文件,一切正常。 我正在使用一個實體,並且其中一個屬性被編入索引。 將我的數據文件解析爲核心數據後的性能很好,一切都很好。

我現在用在相同的數據模型,同一指數等項目產生的sqlite的文件(〜200MB)...和首次啓動我拷貝過來的數據庫文件預填充數據

NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"myproject" ofType:@"sqlite"]; 
    NSString *storePath = [[[self applicationDocumentsDirectory] path] stringByAppendingPathComponent: @"myproject.sqlite"]; 

    NSError *error; 
    if (![[NSFileManager defaultManager] fileExistsAtPath:storePath]) 
    { 
     if ([[NSFileManager defaultManager] copyItemAtPath:defaultStorePath toPath:storePath error:&error]) 
      NSLog(@"Copied starting data to %@", storePath); 
     else 
      NSLog(@"Error copying default DB to %@ (%@)", storePath, error); 
    } 

複製工作正常,數據可以正常訪問。 但是,表現糟透了,索引顯然沒有被使用。
查看複製操作後的sqlite文件大小,它從200Mb變爲120Mb。
模型中的一切都看起來不錯,需要索引的內容被檢查爲索引。

1)複製sqlite時索引數據不會被刪除嗎?
2)是否有可能以編程方式重建索引?
3)其他想法?

+0

你有沒有想過如果你可以編程重建索引?我和你有同樣的問題。謝謝! – baselq

回答

0

看起來問題是項目在兩次測試之間沒有得到很好的清理,它可能是我當時使用的Xcode 4.3中的一個錯誤。

相同的方法現在工作正常。

1

檢查在Apple documentation about this issue

雖然核心數據支持SQLite作爲其持久性存儲類型之一,該數據庫格式是私有的。您無法使用本機SQLite API創建SQLite數據庫,並直接將其與Core Data一起使用(您也不應該使用本機SQLite API來操作現有的Core Data SQLite存儲)。如果您有現有的SQLite數據庫,則需要將其導入到Core Data存儲中(請參閱「Efficiently Importing Data」)。

總結起來,不要做到這一點。數據庫模式是私有的,可能會改變。

當應用程序第一次啓動時,我使用CSV文件在後臺將所有初始數據預加載到CoreData上。順便提一下,謹防多線程CoreData訪問。

希望它有幫助。

+0

呃,不,我恐怕在這種情況下不會有幫助。我沒有使用任何SQLite API順便說一句,只是複製/粘貼sqlite文件,這工作得很好,如果沒有索引問題。我的數據來自200萬行csv文件(這只是一個測試,最終會接近1000萬),所以在第一次啓動時在後臺加載並不會奏效,應用程序需要幾個小時的加載在啓動的時候... –

+0

你不能依賴爲CoreData複製SQLite數據庫,架構可能(並且確實)在設備和iOS版本之間發生變化。 – redent84

+0

好吧,在這種情況下,它是相同的應用程序,相同的設備(模擬器)...我只是在第一遍解析,然後刪除sqlite文件,並將其放在捆綁。在第二遍中,我在第一次啓動時複製sqlite文件,再次這工作正常,只是索引消失。我明白沒有這種支持的意義。接下來的問題是索引是否可以通過編程方式重建。或者,有什麼可能是最好的解決方法?我可以考慮使用海量數據庫的一些應用程序,這些應用程序清晰地編入索引,但在第一次啓動時即可正常運行。 –