使用Realm实现Extension&Host共享数据

来源:互联网 发布:安度因漫画知乎 编辑:程序博客网 时间:2024/05/08 12:40

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


参考资料:

1.http://blog.csdn.net/ralbatr/article/details/44194389 iOS8中Today extension的使用
2.https://realm.io/docs/swift/latest/#realms Realm官方文档
3.https://github.com/realm/realm-cocoa/issues/3022 realm issue

0 0