如果只是簡單的改變模型,比如給乙個實體新增乙個新屬性, core data 可以自動進行資料遷移,也就是指輕量級遷移。輕量級遷移基本上和普通遷移是一樣的,不過不需要提供對映模型,(在對映概況中有介紹),core data自行推斷新模型和目標模型的差異。
輕量級遷移在應用開發的早期階段使用非常方便,當你頻繁的改變物件模型,但是又不想重新生成測試資料的時候。你可以遷移已存在的資料,不需要為每個模型重新建立乙個對映模型,用來建立遷移需要的store。
另乙個好處是,當你使用推測模型(
inferred model)和 sqlite 儲存時,core data 可以執行就地(in situ)遷移,嚴格講,直接生成並執行 sql 語句。因為沒有載入任何資料,所以能很多程度上提公升效能。因此,推薦你盡可能的使用推測模型,即使需要建立對映模型。
以下幾種情況,core data 可以自動推測出:
如果要重新命名,需要將新版本中新實體/屬性的「重新命名識別符號」(renaming identifier)的值設定為原來的實體名或屬性名。具體方法:xcode data modeling 工具->屬性檢視器(property inspector)。
比如你可以:
重新命名乙個 car 實體為automobile
重新命名乙個car的color屬性為paintcolor
可以想象,這樣做以後,如乙個屬性的名字在三次修改中都變化了,且都標記了重新命名識別符號,這樣不管是從 version 2 到 version 3 還是從 version 1 到 version 3 都可以無錯誤的遷移。
另外,core data 還可以自動猜測出:
改變實體/表的體系結構
keys toyes
:
nserror *error = nil;
nsurl *storeurl = <#the url of a persistent store#>;
nspersistentstorecoordinator *psc = <#the coordinator#>;
nsdictionary *options = [nsdictionary dictionarywithobjectsandkeys:
[nsnumber numberwithbool:yes], nsmigratepersistentstoresautomaticallyoption,
bool success = [psc addpersistentstorewithtype:<#store type#>
configuration:<#configuration or nil#> url:storeurl
options:options error:&error];
if (!success)
可以使用
的方法,獲取推測的對映模型,如果可以推測出返回,如果不可以,返回 nil。
執行自動遷移,必須保證 core data 能夠在執行時找到源物件模型和目標物件模型,如果你需要將模型存放於自動搜尋範圍之外,那麼需要我們自己生成推測的模型,並例項化遷移管理器(nsmigrationmanager)。如下面的**,這些**假設已經實現了
sourcemodel 和 destinationmodel,這兩個方法分別返回源物件和目標物件。
- (bool)migratestore:(nsurl *)storeurl toversiontwostore:(nsurl *)dststoreurl error:(nserror **)outerror
// create a migration manager to perform the migration.
nsmigrationmanager *manager = [[nsmigrationmanager alloc]
initwithsourcemodel:[self sourcemodel] destinationmodel:[self destinationmodel]];
bool success = [manager migratestorefromurl:storeurl type:nssqlitestoretype
destinationtype:nssqlitestoretype destinationoptions:nil error:outerror];
return success;
}
note: os x v10.7 and ios 4之前,需要使用 store-specific migration manager執行輕量化遷移,你通過已存在的persistent store來獲得migration manager,使用
,如下面示例展示的
- (bool)migratestore:(nsurl *)storeurl toversiontwostore:(nsurl *)dststoreurl error:(nserror **)outerror
// get the migration manager class to perform the migration.
nsvalue *classvalue =
[[nspersistentstorecoordinator registeredstoretypes] objectforkey:nssqlitestoretype];
class sqlitestoreclass = (class)[classvalue pointervalue];
class sqlitestoremigrationmanagerclass = [sqlitestoreclass migrationmanagerclass];
nsmigrationmanager *manager = [[sqlitestoremigrationmanagerclass alloc]
initwithsourcemodel:[self sourcemodel] destinationmodel:[self destinationmodel]];
bool success = [manager migratestorefromurl:storeurl type:nssqlitestoretype
destinationtype:nssqlitestoretype destinationoptions:nil error:outerror];
return success;
}
coredata 輕量級 遷移(4 2以上)
當coredata中的entity,property或者relationship發生改變以後,預設情況下面,在嘗試呼叫coredata的時候,程式會異常退出。怎樣開啟自動遷移的功能?分三步 nspersistentstorecoordinator persistentstorecoordinator...
04 CoreData輕量級版本的遷移
一 輕量級的資料遷移 例如新增新的實體,新的實體屬性。輕量級版本遷移方案非常簡單,大多數遷移工作都是由系統完成的,只需要告訴系統遷移方式即可。在持久化儲存協調器 psc 初始化對應的持久化儲存 nspersistentstore 物件時,設定options引數即可,引數是乙個字典。psc會根據傳入的...
關於CoreData遷移
1.在新專案中新增coredata的類庫,並在 prefix.h中加入 import 2.拷貝原專案中的.xcdatamodeld檔案到新專案中,新增檔案選擇coredata下nsmanagedobject subclass,選擇data models版本,勾選實體。如果實體已經存在,要手動的刪除原...