iOS开发swift -- Realm入门

一 关于Realm

1、Realm 是一个跨平台的移动数据库引擎,为移动应用的数据持久化而生。其目的是要取代 Core Data 和 SQLite。
2、特点:
(1)使用简单,大部分常用的功能(比如插入、查询等)都可以用一行简单的代码轻松完成,易学习。
(2)Realm 不是基于 Core Data,也不是基于 SQLite 封装构建的。它有自己的数据库存储引擎。
(3)Realm 具有良好的跨平台特性,可以在 iOS 和 Android 平台上共同使用。代码可以使用 Swift 、 Objective-C 以及 Java 语言来编写。
(4)Realm 还提供了一个轻量级的数据库查看工具(Realm Browser)。你也可以用它进行一些简单的编辑操作(比如插入和删除操作)

中文文档
英文文档

二 sdk集成 CocoaPods

$ cd/你的项目地址
$ open -e Podfile

target '你的app' do
    pod 'RealmSwift'
end

$ pod install

三 数据类型

(1)Realm支持以下的属性类型:Bool、Int8、Int16、Int32、Int64、Double、Float、String、NSDate 、以及NSData.CGFloat 属性被取消了,因为它的类型不依赖于平台。
String、NSDate以及 NSData类型的属性都可以添加可选值。Object
类型的属性必须设置为可选。存储可空数字可以通过 Realm 可选值来实现。
(2)关系
Object 能够借助 Object以及 List属性来和另一个 Object建立联系。 List 的接口和 Array非常类似,在 List中的对象能够通过索引下标(indexed subscripting)进行访问。 与 Array所不同的是,List其中只能存放简单的 Object子类类型。

//Realm数据模型是基于标准 Swift 类来进行定义的,使用属性来完成模型的具体定义。通过简单的继承 Object 或者一个已经存在的模型类,您就可以创建一个新的 Realm 数据模型对象。
//由于 Realm 中定义的所有模型在程序启动时就会被解析,所以即使代码中没有调用,它们都需要被初始化。在 Swift 中使用 Realm 的时候,Swift.reflect(_:)函数可用于确定您模型中的信息,这需要确保 init()已被成功调用。这意味着所有非可选的属性必须添加一个默认值。

import RealmSwift

//类型
class ConsumeType:Object {
    //类型名
    dynamic var name = ""
}

//详情
class ConsumeItem:Object {
    //条目名
    dynamic var name = ""
    //金额
    dynamic var cost = 0.00
    //时间
    dynamic var date = Date()
    //所属消费类别
    dynamic var type:ConsumeType?
}

四 创建数据库

        //使用默认数据库
        let realm = try! Realm()
    
        //使用其他数据库
        let config = Realm.Configuration(
            // 获取需要打包文件的 URL 路径
            fileURL: Bundle.main.url(forResource: "MyBundledData", withExtension: "realm"),
            // 以只读模式打开文件,因为应用数据包并不可写
            readOnly: true)
        let realm = try! Realm(configuration: config)
        //内存数据库 通常情况下,Realm 数据库是存储在硬盘中的,但是您能够通过设置 inMemoryIdentifier 而不是设置Realm.Configuration 中的 fileURL 属性,以创建一个完全在内存中运行的数据库。内存数据库在每次程序运行期间都不会保存数据。但是,这不会妨碍到 Realm 的其他功能,包括查询、关系以及线程安全
        let realm = try! Realm(configuration: Realm.Configuration(inMemoryIdentifier: "MyInMemoryRealm"))

五 数据增删改查

    func addCilck(){
        let type1 = ConsumeType()
        type1.name = "衣服"
        let type2 = ConsumeType()
        type2.name = "饮食"
        
        //创建数据记录 可使用数组创建
        let item1 = ConsumeItem(value: ["水果",5999.00,Date(),type1]) 
        
        let item2 = ConsumeItem()
        item2.name = "电影"
        item2.cost = 30.00
        item2.date = Date(timeIntervalSinceNow: -36000)
        item2.type = type2
       
        // * 三次处理事物 会发送三次通知
        
        //增加
        try! realm?.write({
            realm?.add(item1)
            realm?.add(item2)
        })
        
        //更新
        try! realm?.write({
            item3.name = "dog"
        })
        
        //查询
        let item4 = realm?.objects(ConsumeItem.self).filter("cost = 5999")

        //删除
        try!realm?.write({
            realm?.delete(item4!)
        })
    }

六 通知

    var token : NotificationToken? = nil

    override func viewDidLoad() {
        super.viewDidLoad()

        //集合通知
        let result = realm?.objects(ConsumeItem.self)
        token = result?.addNotificationBlock({ (changes: RealmCollectionChange) in
            switch changes {
            case .initial:
                //Results 现在已经填充完毕,可以不需要阻塞 UI 就可以被访问
                debugPrint("initial initial")
                break
            case .update(_, deletions: _, insertions: _, modifications: _):
                //数据库发生更改(增删改)调用
                debugPrint("update update")
                break
            default:
                break  
            } 
        })
        
        //打印出数据库地址
        print(Realm.Configuration.defaultConfiguration.fileURL ?? "nil")        
    }

    deinit {
        token?.stop()
    }

如有不妥,请多多指教:)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容