Swift Realm 完整使用记录
新项目用到了数据库,本来之前用的都是 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 =
// 数据库工具类的版本号
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 = /// 唯一的数据库操作的 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 =
@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 = // 数组使用 List
let dogs = List<SSDog>()
}
5、可以在 viewController 中调用我们的数据库了
5.1、添加一个 person
let realm = SSRealmTool.ss_realm let person = SSPerson()
person.name = "person\(arc4random_uniform(1000))"
person.age = Int(arc4random_uniform()) for _ in ..< { let dog = SSDog()
dog.name = "dog\(arc4random_uniform(1000))"
dog.age = Int(arc4random_uniform())
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 == || realm.objects(SSPerson.self).count == {
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()) for _ in ..< { let dog = SSDog()
dog.name = "dog\(arc4random_uniform(1000))"
dog.age = Int(arc4random_uniform())
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)")
}
Swift Realm 完整使用记录的更多相关文章
- [IOS]Swift使用SVGKit的记录
最近打算使用swift和SVGkit做一个app,遇到了好多状况,对于初学者的几个概念,一个是静态库,第二个是oc和swift混编,第三个是xcode6b4的类库不齐全. 首先是SVGKit的GitH ...
- Centos下分布式跟踪工具Pinpoint的完整部署记录
一.Pinpoint简单介绍Pinpoint是一款对Java编写的大规模分布式系统的APM工具,有些人也喜欢称呼这类工具为调用链系统.分布式跟踪系统.一般来说,前端向后台发起一个查询请求,后台服务可能 ...
- kubeadm安装kubernetes 1.13.1集群完整部署记录
k8s是什么 Kubernetes简称为k8s,它是 Google 开源的容器集群管理系统.在 Docker 技术的基础上,为容器化的应用提供部署运行.资源调度.服务发现和动态伸缩等一系列完整功能,提 ...
- [Swift]LeetCode552. 学生出勤记录 II | Student Attendance Record II
Given a positive integer n, return the number of all possible attendance records with length n, whic ...
- ProxySQL+MGR实现读写分离和主节点故障无感知切换 - 完整操作记录
前面的文章介绍了ProxySQL用法,这里说下ProxySQL中间件针对Mysql组复制模式实现读写分离以及主节点故障时能够自动切换到新的主节点,而应用对此过程无感知的功能.Mysql组复制(MGR) ...
- Tomcat通过Redis实现session共享的完整部署记录
对于生产环境有了一定规模的tomcat集群业务来说,要实现session会话共享,比较稳妥的方式就是使用数据库持久化session.为什么要持久化session(共享session)呢?因为在客户端每 ...
- Ubuntu16.04下安装QQ的完整操作记录(经验证可用)
本机安装了Ubuntu16.04系统,用于日常运维办公.打算在Ubuntu上安装QQ,如下操作记录也使用于Ubuntu18.04: 1)先下载特制的QQ程序包(其实就是基于Wine容器做了一些封装,程 ...
- Tomcat通过Memcached实现session共享的完整部署记录
对于web应用集群的技术实现而言,最大的难点就是:如何能在集群中的多个节点之间保持数据的一致性,会话(Session)信息是这些数据中最重要的一块.要实现这一点, 大体上有两种方式:一种是把所有Ses ...
- Centos7.2下OpenVPN 环境完整部署记录
关于OpenVPN的有关介绍及为何使用OpenVPN在此就不做赘述了,下面直接记录Centos7.2系统下部署OpenVPN环境的操作过程: 1) 先将本机的yum换成阿里云的yum源 [root@t ...
随机推荐
- oracle入坑日记<三>用户详解(角色理解)
1 用户是什么 1.1.权限管理是Oracle的精华,不同用户登录到同一数据库中,可能看到不同数量的表,拥有不同的权限.Oracle 的权限分为系统权限和数据对象权限,共一百多种.如果把Oracl ...
- thinkphp5 部署注意事项
配置tp5 需要修改设置 1. 通过yum安装的Apache,会默认安装在/etc/httpd因此配置文件也在相应的目录中 修改文件vim /etc/httpd/conf/httpd.confhttp ...
- 稀疏矩阵 part 3
▶ 各种稀疏矩阵数据结构下 y(n,1) = A(n,m) * x(m,1) 的实现,CPU版本 ● MAT 乘法 int dotCPU(const MAT *a, const MAT *x, MAT ...
- orcal - 约束
数据库约束 1.非空约束 DROP TABLE member PURGE; CREATE TABLE member( mid number , name varchar2(20) not null, ...
- 软件工程个人作业四--alpha阶段个人总结
个人总结 (1)个人总结 类型 具体技能和面试问题 现在的回答 毕业找工作的时间 语言 最拿手的计算机语言之一,代码量多少 C语言相对熟悉一点 软件实现 你有没有在别的代码的基础上改进,你是怎么读懂别 ...
- 路由对象route
路由对象是不可变 (immutable) 的,每次成功的导航后都会产生一个新的对象.不过你可以 watch (监测变化) 它. 通过 this.$route 访问当前路由,还可以通过router.ma ...
- git版本冲突解决
1. 使用git log命令查看所有的历史版本,获取某个历史版本的id,假设查到历史版本的id是139dcfaa558e3276b30b6b2e5cbbb9c00bbdca96. git log 2. ...
- 10Linux_firewalld-Linux就该这么学
firewalld: runtime:当前生效,重启后失效(默认) permanent:当前不生效,重启后永久生效. A:重启,B:执行firewall-cmd --reload 数据链路层:ipta ...
- shell脚本修改文本中匹配行之前的行的方法
原创文件,欢迎阅读,禁止转载. 例子中是把 finish 前一行的 "yes" 改成 "YES"有一个方法就是利用sed+awk一起来完成. zjk@zjk:~ ...
- 自定义 serializeJSON() 函数
说明:jQuery框架提供了serialize()方法, 能够将DOM元素内容序列化为json格式字符串,用于ajax请求.通过使用serialize()方法,可以提交本页面的所有域. 但是此方法具有 ...