Core Data 資料遷移拾遺

2021-09-11 10:58:03 字數 2663 閱讀 8022

首先感謝掘金 貓d 的推薦,很多朋友關注了我,由於剛開始寫技術文章,並沒有寫出什麼真正的乾貨,深感愧疚。

今天討論的是 core data 資料遷移中的一些細節問題,參閱了不少資料,進行了反覆的驗證,可以說填上了不少坑。

本文討論的範圍僅限於自動觸發的自定義遷移情況,其他情況後續再補充。

在遷移測試前,先將原資料進行備份:

對映模型中的value expression,實際上是n***pression型別值,因此要按照n***pression的規則來寫。它可以進行簡單的數**算(數字型別屬性),如$source.*** + 10;也可以使用類似於 kvc 中的 keypath,如$source.***.yyy,但使用 keypath 的方式要注意,***必須為 nsobject 的子類,在 swift 中使用需注意,另外如果***為集合型別,還可以使用集合操作符,使用方式參考 kvc 的集合操作。

對於yyy的型別有乙個要注意,如果要對映的***屬性型別是datatransformable型別,並且實際儲存的是自定義類的情況,那麼yyy只能引用***中的儲存屬性或例項方法(不帶引數,帶引數的見下一條function使用),如果直接引用計算屬性則會出錯(因為實際儲存中並沒有這個值),但引用計算屬性的get方法是可以的,如有乙個計算屬性是property,那麼應該再提供乙個getproperty()的方法,再使用$source.***.getproperty引用。

屬性對映還有乙個方法就是使用function(object, selector, parameter...),類似objc_msgsend語法,其中object代表遷移過程中可以使用到的物件,例如以下幾個都是 core data 預設的 key,selector代表object擁有的方法指標,parameter為具體引數:

// core data 預設的 key

nsmigrationmanagerkey: $manager

nsmigrationsourceobjectkey: $source

nsmigrationdestinationobjectkey: $destination

nsmigrationentitypolicykey: $entitypolicy

複製**

其中selector的寫法需要非常注意,在 swift 中如果你的方法是 combine(firstname:string, lastname: string),那麼在 function 中就要寫成combinewithfirstname:lastname:,中間要加 "with",objc 中應該也是類似。如果第乙個引數名是withfrom(第乙個字母均為小寫),或者方法名以withfrom結尾(注意第乙個字母要大寫),那就不用再加with,如果不是這種命名方式,編譯時程式就會在第乙個引數名前自動加上with進行匹配。如果不確定怎麼寫方法名,可以在 playground 中列印出來,如:

class

test

}print(#selector(test.combine(firstname:lastname:))) // combinewithfirstname:lastname:

複製**

final

class

v1to2policy: nsentitymigrationpolicy

// 獲取原始屬性值

let newvalue = .... // 計算對映後的屬性值

guard

let newitem = manager.destinationinstances( // 獲取對映後的新物件

sourceinstances: [sinstance]).first else

newitem.setvalue(newvalue, forkey: "***") // 設定新物件的屬性值

}}複製**

// ios 10 及以上寫法

container.persistentstoredescriptions[0].shouldmigratestoreautomatically = true

// ios 10 以下寫法

let options = [nsmigratepersistentstoresautomaticallyoption: true,

do catch

複製**

core data 還有很多說不完的話題,慢慢來吧。

題圖:zigzag - la_paupiette_masquee @unsplash

c 拾遺 處理資料

1 變數命名規則 按照倒數第二點方式進行命名不會導致編譯器錯誤,但會導致不確定性。而最後一點某些平台有長度限制 2 cout十進位制輸出其他進製 cout預設通過十進位制顯示,cout include int main 3 const與 define 使用const是定義乙個常值變數,一般格式為co...

asp知識拾遺

最近做的乙個小 碰到了許多問題,能解決的都解決了,還有的沒辦法就找了替代的解決辦法.下面收集一下 1 在選擇了一系列的checkbox後的提交表單提交後,會獲取到name1,逗號,空格,name2,逗號,空格,結果,系統需要獲取這些值,我用了以下 實現.uname request.form user...

Linux同步拾遺

一般情況下,執行緒在主題函式退出的時候會自動終止,但同時也可以因為接收到另乙個執行緒發來的終止請求而強制終止。執行緒取消的方法是向目標執行緒發cancel訊號,但如何處理cancel訊號則由目標執行緒自己決定,或者忽略,或者立即終止,或者繼續執行到cancelation point 取消點 由不同c...