博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 文件式数据库Realm
阅读量:7232 次
发布时间:2019-06-29

本文共 3787 字,大约阅读时间需要 12 分钟。

hot3.png

Realm和Sqlite类似,都是以文件数据库的方式而存在,一个Realm相当于一个SQLite数据库。它有一个与之对应的文件,一旦创建将持久保存在安卓的文件系统中。要创建一个新的Realm,你可以在任意Activity中调用静态方法Realm.getInstance

Realm myRealm = Realm.getInstance(context);

注意,调用Realm.getInstance,而没有传入RealmConfiguration,会创建一个叫做 default.realm的Realm文件。

如果你想向app中添加另一个Realm,必须使用一个RealmConfiguration.Builder对象,并为 Realm file 指定一个独有的名字。

Realm myOtherRealm =        Realm.getInstance(new RealmConfiguration.Builder(context)                        .name("myRealm.realm")                        .build());

创建ORM对象

public class Country extends RealmObject {     private String name;        private int population;         @PrimaryKey //添加主键    private String code;             public String getCode() {            return code;    }     public void setCode(String code) {            this.code = code;    }        public Country() { }         public String getName() {                return name;    }     public void setName(String name) {                this.name = name;    }         public int getPopulation() {                return population;    }     public void setPopulation(int population) {                this.population = population;    } }

虽然从一个Realm读取数据非常简单(下一节有讲),但是向它写入数据就稍微复杂一点。Realm遵循  (数据库事务正确执行的四个基本要素的缩写)规范,为了确保原子性和一致性,它强制所有的写入操作都在一个事务中执行。

要开始一个新的事务,使用beginTransaction方法。类似地,要结束这个事务,使用commitTransaction方法。

注:事务即英文里面的transaction。

这里演示了如何创建和保存一个Country类的实例:

myRealm.beginTransaction();     // Create an object    Country country1 = myRealm.createObject(Country.class);      // Set its fields    country1.setName("Norway");    country1.setPopulation(5165800);    country1.setCode("NO"); myRealm.commitTransaction();

或者如下进行事务

Country country2 = new Country();country2.setName("Russia");country2.setPopulation(146430430);country2.setCode("RU"); myRealm.beginTransaction();Country copyOfCountry2 = myRealm.copyToRealm(country2);myRealm.commitTransaction();

当然查询也有很多api

RealmResults
 results1 =        myRealm.where(Country.class).findAll();

再来看看官方的api

Dog类

public class Dog extends RealmObject {     @Required //字段不能为null   private String name;      private int age;       //getter,setter方法   }

Person类

public class Person extends RealmObject {           @Required //字段不能为null        private String name;     // imageUrl 是可选字段     private String imageUrl;         private RealmList
 dogs; // 一对多的关系             // getter,setter方法     }

普通用法

      Dog dog = new Dog();      dog.setName("Rex");       dog.setAge(1);       Log.v(TAG, "Name of the dog: " + dog.getName());           //使用建造者模式构建一个配置      RealmConfiguration realmConfig = new RealmConfiguration.Builder(context).build();       //通过配置创建(或打开已存在的)数据库      Realm realm = Realm.getInstance(realmConfig);           //通过连贯语句进行      RealmResults
 puppies = realm.where(Dog.class).lessThan("age", 2).findAll();       puppies.size();

事务操作

第一种事务操作方式

realm.beginTransaction(); realm.copyToRealm(dog); realm.commitTransaction();

第二种事务操作方式(异步线程执行)

        // Queries are updated in real time puppies.size();       // => 1 // Query and update the result asynchronously in another thread             realm.executeTransactionAsync(new Realm.Transaction() {                 @Override           public void execute(Realm realm) {                                Dog theDog = realm.where(Dog.class).equals("age", 1).findFirst();                theDog.setAge(3);                       }                   }, new Realm.Transaction.Callback() {             @Override               public void onSuccess() {            //自动更新原始数据,如puppies.size(); // => 0 because there are no more puppies (less than 2 years old)            dog.getAge();   // => 3 the dogs age is updated                           }                   });

当然,官方的Api也支持RxJava这里就不多说了

官方文档:

转载于:https://my.oschina.net/ososchina/blog/656220

你可能感兴趣的文章
haproxy+pacemaker高可用负载均衡
查看>>
ios开发工程师常见面试题汇总
查看>>
Juniper中IS-IS协议介绍
查看>>
我的友情链接
查看>>
谈一谈可能用到数据持久化的地方
查看>>
我的友情链接
查看>>
centos上的时间同步
查看>>
使用mysqladmin命令修改MySQL密码与忘记密码
查看>>
利用fdisk将硬盘剩余空间进行分区
查看>>
解决键盘挡住部分组件 降低用户体验的解决办法
查看>>
开启Cisco交换机DHCP Snooping功能
查看>>
linux中目录的说明小结
查看>>
使用sublime同步编辑线上脚本
查看>>
new和delete
查看>>
Exchange 2010 – NLB Client Access (on Virtual Machines)
查看>>
Lync Server 2010迁移至Lync Server 2013部署系列 Part15:迁移中央管理器(CMS)
查看>>
HIVE中的自定义函数
查看>>
我的友情链接
查看>>
35场面试,应届计算机毕业生的霸气求职之路
查看>>
通过IP来获取位置
查看>>