2011-04-12 96 views
7

我找不到在蘋果文檔這些步驟清晰的描述......核心數據存儲庫包含在應用程序捆綁

  1. 我有一個xcdatamodeld在我的Xcode項目
  2. 在啓動時,我的應用程序解析XML(項目資源),以填補核心數據存儲(SQLLite)
  3. 在我的應用程序的生命週期,我添加,刪除,存儲的更新數據

現在,我想停止這樣做重設備和直接的XML解析過程包括包含所需數據的商店。

我有這方面的一些問題:

  • 我可以填補與OS X的應用程序商店,然後包括這家店在我的XCode-IOS項目?
  • 我的商店沒有出現在Xcode。實際上它是在運行時創建的。如何在項目中添加商店並將其鏈接到我的xcdatamodeld?
  • 我已閱讀,這樣做會阻止我的商店被寫的...我想我必須將它在啓動時(核心數據實用教程是一個很大的幫助)在正確的地方複製。我對嗎 ?

謝謝你的提示。網址或其他SO問題將非常感謝!

Kheraud

回答

14

可以包括存儲文件(sqlite的分貝的大部分時間)在您的應用程序。 然後在你的應用程序代理編輯persistentStoreCoordinator吸氣merhod:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 

    if (persistentStoreCoordinator_ != nil) { 
     return persistentStoreCoordinator_; 
    } 

    NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"CoreDataStore.sqlite"]; 

    // Check if the store exists in. 
    if (![[NSFileManager defaultManager] fileExistsAtPath:storePath]) { 
     // copy the payload to the store location. 
     NSString *bundleStore = [[NSBundle mainBundle] pathForResource:@"YourPayload" ofType:@"sqlite"]; 

     NSError *error = nil; 
     [[NSFileManager defaultManager] copyItemAtPath:bundleStore toPath:storePath error:&error]; 

     if (error){ 
      NSLog(@"Error copying payload: %@", error); 
     } 
    } 

    NSError *error = nil; 
    NSURL *storeURL = [NSURL fileURLWithPath:storePath]; 
    persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    }  

    return persistentStoreCoordinator_; 
} 
+0

謝謝你的這段代碼。你不覺得設備/核心數據/複製數據庫之間可能存在兼容性問題嗎? – iwalktheline 2011-04-12 13:47:41

+0

不,我主要是使用模擬器創建數據庫,然後在設備上使用它,這是沒有問題的。 – rckoenes 2011-04-12 14:01:23

+0

在你的回答的第二句中,** persantstore **是什麼? (打字錯誤?) – David 2013-08-02 19:20:03

6

你當前做(首次啓動填充)是填充核心數據存儲的「推薦」的方式。雖然它是一個有點hackish,你可以然而播種設備上的數據庫,如下所示:

  1. 啓動您的應用程序在模擬器
  2. 什麼就做什麼,你需要爲模擬器應用填充核心數據店裏做
  3. 停止模擬器應用
  4. 導航到模擬的文檔文件夾(類似~/Library/Application Support/iPhone Simulator/4.3/Applications/335567A0-760D-48AF-BC05-7F0D9BD085B6/<app-name>.app/
  5. 找到SQLite數據庫(它初始化核心數據時的名字你給它)
  6. 有限公司PY這一數據庫項目,並將其添加到被複制的資源
  7. 添加一些代碼到你的application:didFinishLaunchingWithOptions:方法,以便在首次啓動時,它會將從只讀資源目錄應用程序的文件目錄數據庫。當然,你需要之前做到這一點初始化核心數據。

取決於你在你的數據庫中存儲什麼,你可能會發現然而大端與小字節序的問題,或其他不兼容。爲了使這種方法更安全一些,你可以在你的Mac上轉儲模擬器數據庫(splite3 databasefile .dump >dumpfile),然後在你的項目中包含轉儲文件(如上所述),並在首次啓動時將轉儲內容轉儲到你的應用程序中(逐行讀取它)行,並將sql語句交給sqlite API)。

+0

好的。看來使用SQL轉儲和解析+填充是一個好方法。但處理XML並不複雜(我認爲)。此外,我通過網絡接收XML數據,我需要解析它。我會保持我的XML機制,因爲...感謝您的幫助,我可以稍後使用:) – iwalktheline 2011-04-12 13:46:15

10
  1. 使用應用程序的數據模型和類編寫實用程序應用程序。使用實用程序應用程序根據XML提供的數據生成持久性存儲。
  2. 與其他資源一樣,將商店文件添加到應用程序包
  3. 在要存儲活動商店的應用程序目錄中選擇一個位置,例如庫目錄。
  4. 啓動後,應用程序檢查商店是否在目錄中。如果不是,應用程序應該像使用其他文件一樣,使用標準NSFileManger方法將應用程序包中的商店複製到目錄中。 (通常,只有在第一次創建商店時才需要這樣做。)

這就是它的全部內容。

+2

是否可以,如果我保持在Bundle中的sqlite文件,因爲它是隻讀的? – onmyway133 2013-11-05 04:54:57

+0

核心數據將希望在應用程序的應用程序支持目錄中找到sqlite文件:'try FileManager.default.url(for:.applicationSupportDirectory,\t \t \t in:.userDomainMask,appropriateFor:nil,create:false)'是得到這個的一種方法。但是,如果要預加載數據庫,則可以將該文件的COPY複製到應用程序支持中。 - 哎呀,這當然是Swift,因爲它是幾年後;-) – leanne 2016-12-09 21:54:26

相關問題