Swift-Realm简单使用,代替Sqlite、Crodata的强大数据库

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
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值