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()
    }

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

    原文作者:Hayley__
    原文地址: https://www.jianshu.com/p/a8ceae4c0580
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞