1. 程式人生 > >使用Realm實現Extension&Host共享資料

使用Realm實現Extension&Host共享資料

3.這次主要講解使用Realm進行Extension和Host共享資料
本文主要將該問題的解決過程和方法,參考資料會在本文末尾給出。

前言

Realm是一個第三方的跨平臺移動端資料庫,不是基於sqlite和coredata的,它做了一個自己的儲存系統和資料庫引擎。但是使用起來比coredata簡單太多。
Extension是iOS8的SDK開放的新功能,有多種型別的Extension:

extension category

本文只講Today Extension。
最常用的extension&host共享資料方法是利用NSUserdefault。但是一旦資料結構複雜,使用起來就非常不方便。這也要根據App的資料情況做選擇,如果資料量不大,且以展示資料為主,則用userdefault,否則還是選擇存資料庫的方法比較合適。

正文

我要做的App,是資料量比較大,且對Extension進行互動並且要記錄互動操作。對update,delete,add操作較為頻繁。

下面一步步講述我的實現過程:
1.跳過App group這些設定步驟,一搜一堆。
2.首先建立Realm資料模型,看下圖:

create realm

如果你沒有找到“Realm”選項,請先安裝Realm的Xcode Plugin。傳送門

3.檔案建好之後,寫好模型中所需的屬性,下面是我寫好的一個數據模型:

realm model

ignoredProperties:該方法是儲存時,忽略哪些屬性,一般返回為空即可。
primaryKey:設定模型的key值,同一個key值的資料,被插入兩次,就會出現crash。

4.設定該模型的Target,這一步是保證Extension和Host都能識別這個模型。

target

5.設定Realm和SwiftRealm的Target,同上。

6.Extension和Host的儲存路徑是不一樣的,但是我們設定了App Group之後,可以將realm資料檔案儲存到共享目錄中。
我們通過”po Realm.defaultPath”可以看到Realm在host和extension中的路徑。

realm path

這是最重要的一步,但也很簡單:
在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。

如有建議或問題,歡迎在下面留言 ^ ^
wechat

參考資料: