2011-04-22 25 views
0

我目前在店裏這是SQLite的支持,並且不使用核心數據的應用程序的核心數據。在過去,當我想要發佈SQLite發生更改的更新時,更新將包含一些可檢測應用程序版本的代碼,並在必要時以編程方式更新表。現在我正在開發一個使用Core Data的更新。我不關心任何現存的舊數據,我知道如何以編程方式刪除所有舊的SQLite表。所有的核心數據模型文件包含在更新二進制文件中,還是必須以編程方式生成部分或全部的核心數據模型? .xcdatamodeld是否會包含在二進制文件中?任何其他我應該警惕的陷阱?更新實時應用程序使用,目前不使用核心數據

感謝您的幫助

回答

0

隨着核心數據更新到新版本時,它可以是相當棘手。我經歷過很多次,即使核心數據模型中的一點點變化都會導致怪異的應用行爲(在某種程度上可以理解)。避免任何不必要的副作用的最簡單方法是更改​​名稱。下面的代碼

- (NSPersistentStoreCoordinator *) persistentStoreCoordinator { 
// D_IN; 
if (persistentStoreCoordinator != nil) { 
    return persistentStoreCoordinator; 
} 
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]]; 

// Allow inferred migration from the original version of the application. 
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
         [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; 

NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"myData073.sqlite"]]; 

NSError *error = nil; 

if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl 
                options:options error:&error]){ 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 


} 
// D_OUT; 

return persistentStoreCoordinator; 

}

所以你真正需要做的是將名稱myData073.sqlite改爲例如myData074.sqlite

的數據模型描述文件是不是真正的二進制文件的一部分,但所有的類和訪問方法肯定是它背後的模型。你不必擔心這一點。 PS甚至在開發過程中我改名字頻繁,否則人們可能會浪費大量的時間尋找編碼是不是真的存在錯誤...

+0

好了,我要去測試了這一點。感謝您的迴應! – Rick 2011-04-22 06:10:05

+0

這兩個答案都是有用的,雖然這個答案更直接回答我原來的問題所以這就是爲什麼我接受了這個響應 – Rick 2011-07-28 04:33:29

+0

@Rick具有u嘗試了一下。我有一個問題,我在App Store中有一個應用程序,我將發佈它的新版本,並且我已經更改了數據庫結構,因此對我有幫助。 – 2012-08-03 14:33:01

0

一個應用程序商店更新替換整個應用程序包,所以一切都在你的應用程序包,包括任何核心數據模型,都將包含在內。您可以通過在自己的設備上安裝Ad Hoc或開發人員版本構建App Store(不首先刪除)來測試此功能。在編譯的應用程序中,模型文件被編譯或處理,並具有不同的擴展名(.momd,.mom)。所以你會看到那些,而不是.xcdatamodeld或.xcdatamodel。

其他缺陷:現在,核心數據數據文件不是你的包的一部分。如果您希望更新的應用程序以空數據庫開頭,則不必做任何特殊的事情。但是,如果您想要使用預先填充的數據庫進行安裝/更新,則必須找出將該數據庫放入設備的讀寫位置的方法。基本上,你生成一個核心數據文件,在應用程序包包括它作爲您的Xcode項目的一部分,那麼在第一次發射,在編程您的文檔或庫文件夾(使用正確的可可API尋找這些)某處複製它。

陷阱2:修改與SQLLite在Mac上的空核心數據文件建議在一些網站上,但蘋果專門DIS-建議。相反,您可能會編寫一個iOS應用程序,將數據放入核心數據並在模擬器中運行。 How do I initialize a store with default data?

作爲user387184指出,你的下一個更新改變現有的核心數據的數據庫模型可能很麻煩。儘可能第一次嘗試讓模型正確無誤。

相關問題