1,什么是Realm
Realm于2014 年7月发布,是一个跨平台的移动数据库引擎,专门为移动应用的数据持久化而生。其目的是要取代Core Data和SQLite。
2,关于Realm,你要知道下面几点:
(1)使用简单,大部分常用的功能(比如插入、查询等)都可以用一行简单的代码轻松完成,学习成本低。
(2)Realm不是基于Core Data,也不是基于SQLite封装构建的。它有自己的数据库存储引擎。
(3)Realm具有良好的跨平台特性,可以在iOS和Android平台上共同使用。代码可以使用 Swift 、 Objective-C 以及 Java 语言来编写。
(4)Realm 还提供了一个轻量级的数据库查看工具(Realm Browser)。你也可以用它进行一些简单的编辑操作(比如插入和删除操作)
3,支持的类型
(1)Realm支持以下的属性类型:Bool、Int8、Int16、Int32、Int64、Double、Float、String、NSDate(精度到秒)以及NSData.
(2)也可以使用List<object> 和Object来建立诸如一对多、一对一之类的关系模型,此外Object的子类也支持此功能。
4,Realm的安装配置
(1)先去Realm的官网去下载最新框架:http://static.realm.io/downloads/swift/latest
(2)拖拽RealmSwift.framework和Realm.framework文件到”Embedded Binaries”选项中。选中Copy items if needed并点击Finish
5,使用Realm Browser查看数据库
(1)默认数据库是应用的 Documents 文件夹下的一个名为“default.realm”。
(2)使用Realm Browser工具可以很方便的对.realm数据库进行读取和编辑(在App Store中搜索Realm Browser即可下载)。
6,从数据库中读取记录并显示到表格中来
(1)通过查询操作,Realm 将会返回包含 Object 集合的Results实例。Results 的表现和 Array 十分相似,并且包含在 Results 中的对象能够通过索引下标进行访问。
(2)所有的查询(包括查询和属性访问)在 Realm 中都是延迟加载的,只有当属性被访问时,才能够读取相应的数据。
(3)查询结果并不是数据的拷贝:修改查询结果(在写入事务中)会直接修改硬盘上的数据。
PS: ...
Realm为何无法限制查询数量?
通常查询数据库数据时,我们可以在sql语句中添加一些限制语句(比如rownum,limit,top等)来限制返回的结果集的行数。
但我们使用Realm会发现,它没有这种分页功能,感觉不管查什么都是把所有的结果都捞出来。比如我们只要User表的前10条数据,那么做法是先查询出所有的User数据,再从结果集中取出前10条数据。
有人可能会担心,如果数据库中数据非常多,那每次都这么查不会影响性能吗?
其实大可放心,由于Realm都是延迟加载的,只有当属性被访问时,才能够读取相应的数据。不像通常数据库,查询后,查询结果是从数据库拷贝一份出来放在内存中的。而Realm的查询结果应该说是数据库数据的引用,就算你查出来,如果不用也不会占用什么内存。
下面附带一个实例:
import UIKit
import RealmSwift
//消费类型
class ConsumeType:Object {
//类型名
dynamic var name = ""
}
//消费条目
class ConsumeItem:Object {
//条目名
dynamic var name = ""
//金额
dynamic var cost = 0.00
//时间
dynamic var date = NSDate()
//所属消费类别
dynamic var type:ConsumeType?
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
//创建一个按钮
let btn: UIButton = UIButton(type: .System);
btn.center = self.view.center ;
btn.backgroundColor = UIColor.yellowColor() ;
btn.frame.size = CGSizeMake(60, 40);
btn.setTitle("按钮", forState: .Normal);
btn.addTarget(self, action: #selector(ViewController.btnClick(_:)), forControlEvents: .TouchUpInside);
self.view.addSubview(btn);
//使用默认的数据库
let realm = try! Realm() ;
//查询所有的消费记录
let items = realm.objects(ConsumeItem) ;
//已经有记录的话就不插入
if items.count > 0 {
return ;
}
//创建两个消费类型
let type1 = ConsumeType() ;
type1.name = "购物" ;
let type2 = ConsumeType() ;
type2.name = "娱乐" ;
//可使用数组创建
let item1 = ConsumeItem(value: ["买一台电脑",5999.00,NSDate(),type1]);
let item2 = ConsumeItem()
item2.name = "看一场电影"
item2.cost = 30.00
item2.date = NSDate(timeIntervalSinceNow: -36000)
item2.type = type2
let item3 = ConsumeItem()
item3.name = "买一包泡面"
item3.cost = 2.50
item3.date = NSDate(timeIntervalSinceNow: -72000)
item3.type = type1
//数据持久化操作(类型记录也会自动添加)
try! realm.write({
realm.add(item1) ;
realm.add(item2) ;
realm.add(item3) ;
});
}
func btnClick(btn: AnyObject){
let secondVC: SecondViewController = SecondViewController() ;
self.presentViewController(secondVC, animated: true) {
};
}
查询数据:
import UIKit
import RealmSwift
class SecondViewController: UIViewController,UITableViewDelegate,UITableViewDataSource{
var tableView: UITableView! ;
var dformatter = NSDateFormatter() ;
let cellID: String = "MyCell" ;
//保存从数据库中查询出来的结果集
var consumeItems:Results<ConsumeItem>? ;
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.dformatter.dateFormat = "MM月dd日 HH:mm" ;
self.tableView = UITableView(frame: self.view.bounds, style: .Plain);
self.tableView.delegate = self ;
self.tableView.dataSource = self ;
self.view.addSubview(self.tableView);
//创建一个重用的单元格
self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: cellID);
//使用默认的数据库
let realm = try! Realm() ;
//查询所有的消费记录
consumeItems = realm.objects(ConsumeItem) ;
}
//在本例中,只有一个分区
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1;
}
//返回表格行数(也就是返回控件数)
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.consumeItems!.count
}
//创建各单元显示内容(创建参数indexPath指定的单元)
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)
-> UITableViewCell
{
//同一形式的单元格重复使用,在声明时已注册
let cell = UITableViewCell(style: .Value1, reuseIdentifier: cellID)
let item = self.consumeItems![indexPath.row]
cell.textLabel?.text = item.name + " ¥" + String(format: "%.1f", item.cost)
cell.detailTextLabel?.text = self.dformatter.stringFromDate(item.date)
return cell
}