使用Realm實現Extension&Host共享資料
3.這次主要講解使用Realm進行Extension和Host共享資料
本文主要將該問題的解決過程和方法,參考資料會在本文末尾給出。
前言
Realm是一個第三方的跨平臺移動端資料庫,不是基於sqlite和coredata的,它做了一個自己的儲存系統和資料庫引擎。但是使用起來比coredata簡單太多。
Extension是iOS8的SDK開放的新功能,有多種型別的Extension:
本文只講Today Extension。
最常用的extension&host共享資料方法是利用NSUserdefault。但是一旦資料結構複雜,使用起來就非常不方便。這也要根據App的資料情況做選擇,如果資料量不大,且以展示資料為主,則用userdefault,否則還是選擇存資料庫的方法比較合適。
正文
我要做的App,是資料量比較大,且對Extension進行互動並且要記錄互動操作。對update,delete,add操作較為頻繁。
下面一步步講述我的實現過程:
1.跳過App group這些設定步驟,一搜一堆。
2.首先建立Realm資料模型,看下圖:
如果你沒有找到“Realm”選項,請先安裝Realm的Xcode Plugin。傳送門
3.檔案建好之後,寫好模型中所需的屬性,下面是我寫好的一個數據模型:
ignoredProperties:
該方法是儲存時,忽略哪些屬性,一般返回為空即可。
primaryKey:
設定模型的key值,同一個key值的資料,被插入兩次,就會出現crash。
4.設定該模型的Target,這一步是保證Extension和Host都能識別這個模型。
5.設定Realm和SwiftRealm的Target,同上。
6.Extension和Host的儲存路徑是不一樣的,但是我們設定了App Group之後,可以將realm資料檔案儲存到共享目錄中。
我們通過”po Realm.defaultPath”可以看到Realm在host和extension中的路徑。
這是最重要的一步,但也很簡單:
在AppDelegate中寫上這幾句程式碼即可:
var config = Realm.Configuration()
let container = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.com.XXX.XXX”)
let realmURL = container!.URLByAppendingPathComponent("default.realm")
config.path = realmURL.path
Realm.Configuration.defaultConfiguration = config
這段程式碼就是Realm的預設儲存路徑。注意這裡的修改只能作用於Host,這時在用”po Realm.defaultPath”檢視路徑,發現儲存路徑被切換到AppGroup下。
7.在Extension中對Realm預設路徑進行設定,同上。
一些坑
雖然問題解決了,但是我自己在解決的過程中,也遇到了一些問題,現在也無解:
1.如果僅僅是設定Realm的儲存路徑,是可以在Realm的初始化方法中實現的:
let realm = Realm(name:path)
但是這個方法執行後,在模擬器上是OK的,一切正常,但是上真機除錯,一執行就crash。
如有建議或問題,歡迎在下面留言 ^ ^