Android 文件式数据库Realm

原创
2016/04/10 17:10
阅读数 2.3K

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遵循 ACID (数据库事务正确执行的四个基本要素的缩写)规范,为了确保原子性和一致性,它强制所有的写入操作都在一个事务中执行。

要开始一个新的事务,使用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<Country> 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<Dog> 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<Dog> 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这里就不多说了


官方文档:Realm for Android



展开阅读全文
加载中
点击加入讨论🔥(1) 发布并加入讨论🔥
1 评论
3 收藏
2
分享
返回顶部
顶部