学习mac开发第九弹 10分钟学会数据库简单操作
简单介绍下我们将用什么数据库,能在10分钟就能会。 它就是Realm,在之前我从来没用他开发。只是传说听过他的强大,居然在我简单的看了一眼文档居然就上手操作,我不在这里过分介绍他了,网上很多了,官网也有中文介绍。下面会总结我遇到的一些问题吧。realm 本身有很多强大的功能,本文只是花10分钟在mac 开发中实践了简单的增删改查
他的优点很明显
- 简单
- live objec
- 线程安全
- 懒加载
- 离线优先
-
接入realm库 采用了最简单的方法下载后把库拖到工程里,当然你也可以采用cocoapods 方式
拖拽后确认是否成功引入 如下图
如果需要上传AppStroe 需要创建RunScript 添加 下面。
bash "${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/Realm.framework/strip-frameworks.sh"
-
要实现一个能够录入学生姓名,年龄,性别,地址,当然还有一个唯一的学号
首先我们来创建一个学生对象
import Cocoa
import RealmSwift
class StudentModel: Object {
dynamic var studentName = ""
dynamic var studentAge = 0
dynamic var studentID = 1
dynamic var studentSex = ""
dynamic var studentAddress = ""
//主键
override static func primaryKey() -> String? {
return "studentID"
}
}
用学生的学号当做唯一的主键,方便我们快速查询。
下面搭建个简单的页面
下面是简单的添加方法
//把数据添加Realm 数据库中
func addStudent() {
//没有自增主键
let lastStudent = realm.objects(StudentModel.self).sorted(byKeyPath:"studentID", ascending: true).last
let studentModel = StudentModel()
studentModel.studentAge = Int(self.ageTextField.intValue)
studentModel.studentSex = self.sex!
studentModel.studentAddress = self.addressTextField.stringValue
studentModel.studentName = self.nameTextField.stringValue
if lastStudent?.studentID != nil {
studentModel.studentID = lastStudent!.studentID + 1
}else {
studentModel.studentID = 1;
}
weak var weakSelf = self
try! realm.write {
realm.add(studentModel)
weakSelf?.hintLable.stringValue = "添加成功"
}
}
我最初的想法是主键自增,后来没有发现相对应的Api.只能排序后去找最后一个学生的学号加一当前学生的学号。因为 Realm 是一个 MVCC 数据库 ,底层用 C++ 编写。MVCC 指的是多版本并发控制。这样的机制导致没法自增主键。如果敢兴趣可以看其他文章详情介绍。
官网提供了Realm Browse 工具,方便查看数据库的改变。 我们可以通过下面代码找到数据库的位置
print(("Path to realm file: " + realm.configuration.fileURL!.absoluteString))
- 增加
下面我们添加一名学生吧 学生studentID 为 1
下面通过学生studentID = 1 条件查询这个学生的信息
//全局变量
lazy var realm = try! Realm()
//查询学生的model
var item:StudentModel! = nil
//搜索结果集合
var searchValue:Results<StudentModel>?
- 查询
searchValue = realm.objects(StudentModel.self).filter("studentID = %d",studentValue!)
self.item = searchValue![0]
当然你也可以用NSPredicate 方式查询
let predicate = NSPredicate(format: "studentID = %d",studentValue)
searchValue = realm.objects(StudentModel.self).filter(predicate)
查询的核心代码就一句。但是很遗憾我没有发现可以到直接返回对象而不是集合的方法.如何你发现了留言告诉我一声,有时间我在查查资料。
- 修改
修改下查询后人员的地址把china 改成USA 代码如下
try! realm.write {
self.item.studentAddress = self.changAddressTextField.stringValue;
}
效果如下
- 删除
try! realm.write {
if self.item != nil {
realm.delete(self.item)
}
}
// Delete all objects from the realm
try! realm.write {
realm.deleteAll()
}