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    }



0 0
原创粉丝点击