博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift Realm 完整使用记录
阅读量:5788 次
发布时间:2019-06-18

本文共 5148 字,大约阅读时间需要 17 分钟。

新项目用到了数据库,本来之前用的都是 SQL,但是语法写的实在是恶心,所以使用 Realm 尝试一下。

1、我使用的 pod 库,所以先 pod 库安装一下,安装完别忘了先编译一下,不然 import 不到头文件

platform :ios, '8.0'target 'realmExmple' do  use_frameworks!pod 'RealmSwift'end

 

2、在 AppDelegate 的 didFinishLaunchingWithOptions 中添加如下方法,引入头文件 import RealmSwift

/* Realm 数据库配置,用于数据库的迭代更新 */        let schemaVersion: UInt64 = 0        // 数据库工具类的版本号        SSRealmTool.schemaVersion = schemaVersion                let config = Realm.Configuration(schemaVersion: schemaVersion, migrationBlock: { (migration, oldSchemaVersion) in            /* 什么都不要做!Realm 会自行检测新增和需要移除的属性,然后自动更新硬盘上的数据库架构 */            if (oldSchemaVersion < schemaVersion) {                print("----数据库升级")            }        })                Realm.Configuration.defaultConfiguration = config                Realm.asyncOpen { (realm, error) in            /* Realm 成功打开,迁移已在后台线程中完成 */            if let _ = realm {                print("Realm 数据库配置成功")            } else if let error = error { /* 处理打开 Realm 时所发生的错误 */                print("Realm 数据库配置失败:\(error.localizedDescription)")            }        }

 

3、接下来开始写数据库工具类,新建一个 Swift 文件 SSRealmTool

class SSRealmTool {        /// 数据库版本号    static var schemaVersion: UInt64 = 0        /// 唯一的数据库操作的 Realm    static let ss_realm = realm()        /// 获取数据库操作的 Realm    private static func realm() -> Realm {                // 获取数据库文件路径        let fileURL = URL(string: NSHomeDirectory() + "/Documents/demo.realm")        // 在 APPdelegate 中需要配置版本号时,这里也需要配置版本号        let config = Realm.Configuration(fileURL: fileURL, schemaVersion: schemaVersion)                return try! Realm(configuration: config)    }    }

 

4、新建两个对象 SSDog SSPerson

class SSDog: Object {    // 主键不自增,如果要主键的话,这样写不会有重复的主键//    @objc dynamic var id = NSUUID().UUIDString    // @objc dynamic **必须写    @objc dynamic var name = ""    @objc dynamic var age = 0    @objc dynamic var date = Date()    // 如果需要增加属性的话,只需要在 appdelegate 的版本号加 1 即可自动升级//    @objc dynamic var weight = 1        /// 所属人可选    @objc dynamic var person: SSPerson?        // 设置主键的方法//    override static func primaryKey() -> String? {//        return "id"//    }}
class SSPerson: Object {    @objc dynamic var name = ""    @objc dynamic var age = 0        // 数组使用 List    let dogs = List
()}

5、可以在 viewController 中调用我们的数据库了

 

5.1、添加一个 person

let realm = SSRealmTool.ss_realm                let person = SSPerson()        person.name = "person\(arc4random_uniform(1000))"        person.age = Int(arc4random_uniform(20))                for _ in 0..<9 {                        let dog = SSDog()            dog.name = "dog\(arc4random_uniform(1000))"            dog.age = Int(arc4random_uniform(10))            dog.person = person            person.dogs.append(dog)            print("添加一只狗:\(dog.name),age:\(dog.age),date:\(dog.date)")        }                try! realm.write {            realm.add(person)            print("添加一个人:\(person.name),年龄:\(person.age)")        }

 

5.2、查询

let realm = SSRealmTool.ss_realm        print("总共有\(realm.objects(SSPerson.self).count)位人")        print("总共有\(realm.objects(SSDog.self).count)只狗")                if realm.objects(SSDog.self).count == 0 || realm.objects(SSPerson.self).count == 0 {            return        }        let dogs = realm.objects(SSDog.self).filter("age <= 5")                for dog in dogs {            print("---查询狗:\(dog.name), age:\(dog.age),主人是:\(dog.person?.name ?? "无人")")        }                print("---------person---------")                let persons = realm.objects(SSPerson.self).filter("age <= 10")                for person in persons {            print("---查询name:\(person.name), 有\(person.dogs.count)只狗")            print("-----每个人下面的狗-------")            let someDogs = person.dogs.filter("age <= 5")            for someDog in someDogs {                print("---查询狗:\(someDog.name), age:\(someDog.age),主人是:\(someDog.person?.name ?? "无人")")            }        }

 

5.3、更新

let realm = SSRealmTool.ss_realm                let dogs = realm.objects(SSDog.self).filter("age > 5")                for dog in dogs {                        try! realm.write {                                print("---更新前name:\(dog.name), age:\(dog.age)")                dog.name += "修改"//                realm.add(dog, update: true) // 这需要主键            }        }                let dogs2 = realm.objects(SSDog.self).filter("age > 5")                for dog in dogs2 {            print("---更新后name:\(dog.name), age:\(dog.age)")        }

5.4、删除

let realm = SSRealmTool.ss_realm                let person = SSPerson()        person.name = "person\(arc4random_uniform(1000))"        person.age = Int(arc4random_uniform(20))                for _ in 0..<9 {                        let dog = SSDog()            dog.name = "dog\(arc4random_uniform(1000))"            dog.age = Int(arc4random_uniform(10))            dog.person = person            person.dogs.append(dog)            print("添加一只狗:\(dog.name),age:\(dog.age),date:\(dog.date)")        }                try! realm.write {            realm.add(person)            print("添加一个人:\(person.name),年龄:\(person.age)")        }

 

转载于:https://www.cnblogs.com/shen5214444887/p/8421207.html

你可能感兴趣的文章
忆高中三位良师
查看>>
使用QTP录制自带Flight小实例
查看>>
函数库管理
查看>>
Adding custom instruction to RISCV ISA and running it on gem5 and spike(转)
查看>>
JProfiler学习笔记
查看>>
Loadrunner脚本编程(4)-数据类型操作和字符串操作
查看>>
Codeforces Round #529 (Div. 3) 题解
查看>>
CodeForces 598A Tricky Sum
查看>>
HDU 1151 Air Raid
查看>>
RxJava 详解
查看>>
【Daily Scrum】
查看>>
ECMAScript中基本类型和引用类型的值在复制变量值时的区别
查看>>
EF实体部分更新的问题
查看>>
雷林鹏分享:PHP 变量
查看>>
Spring Security Oauth2 认证(获取token/刷新token)流程
查看>>
PyQt5教程——组件(7)
查看>>
arpg网页游戏之地图(二)
查看>>
读取磁盘和卷
查看>>
Docker web管理界面——Shipyard
查看>>
React文档(十九)不使用ES6
查看>>