Core Data 輕量級遷移

2021-06-22 04:04:24 字數 3550 閱讀 9240

如果只是簡單的改變模型,比如給乙個實體新增乙個新屬性, 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版本,勾選實體。如果實體已經存在,要手動的刪除原...