Swift-Realm简单使用,代替Sqlite、Crodata的强大数据库
来源:互联网 发布:软件人力外派 编辑:程序博客网 时间:2024/05/17 02:29
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 UIKitimport 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 UIKitimport RealmSwiftclass 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 }
- Swift-Realm简单使用,代替Sqlite、Crodata的强大数据库
- Realm 数据库的简单使用
- Realm数据库的简单使用
- Swift - Realm数据库简单的 增-删-改-查
- Swift - Realm数据库的使用详解(附样例)
- SQLite数据库的简单应用(swift)
- 数据库Realm的使用
- ActiveSQLite更简单的Swift数据库方案(SQLite.swift封装)
- Realm 数据库取代sqlite?
- SQLite数据库的简单使用
- sqlite数据库的简单使用
- SQLite数据库的简单使用
- SQLite---强大的轻型数据库
- Android Realm数据库的使用
- IOS Realm数据库的使用
- SQLite数据库基本使用(swift)
- 数据库简单使用之Realm入门
- SQLite数据库简单使用
- sublime安装使用
- 并行、并发、同步和互斥
- openCV的配置
- SQLite简介
- Xcode真机测试could not find developer disk image解决方法
- Swift-Realm简单使用,代替Sqlite、Crodata的强大数据库
- memcache(三)应用场景,session存入memcache
- hibernate级联情况下以commit或者flush来进行级联提交
- DB2中的数据加密
- 最大熵的Java实现
- weblogic 设置多少个GC线程合适
- 解决eclipse中MAVEN项目提示One or more constraints have not been satisfied
- Ansible UI web 界面搭建 ----欢迎大家一起讨论研究
- ST算法(Sparse-Table)