当前位置: 首页 > news >正文

Android 文件式数据库Realm

2019独角兽企业重金招聘Python工程师标准>>> 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遵循 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



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

相关文章:

  • mobAndroid免费验证短信
  • 【css3】浏览器内核及其兼容性
  • 一个苹果开发者的苹果表体验报告
  • 责任链模式
  • C 数据结构与算法系列 插入排序
  • spring-001-Ioc 顶层容器
  • Android自动化测试之Monkeyrunner使用方法及实例
  • 【案例】slave_net_timeout 问题一则
  • Node+Express+node-mysql 实战于演习 全套mysql(增删改查)
  • 我与mongodb 二三事(2)
  • 失眠的症状是什么
  • 20145222黄亚奇《Java程序设计》实验二实验报告
  • TaskCompletionSource的使用场景
  • Nginx负载均衡配置实例详解(转)
  • H5页面快速搭建之高级字体应用实践
  • 【Amaple教程】5. 插件
  • CAP理论的例子讲解
  • css属性的继承、初识值、计算值、当前值、应用值
  • Gradle 5.0 正式版发布
  • js操作时间(持续更新)
  • JWT究竟是什么呢?
  • Redis中的lru算法实现
  • spring-boot List转Page
  • vue-cli3搭建项目
  • yii2权限控制rbac之rule详细讲解
  • 搭建gitbook 和 访问权限认证
  • 第2章 网络文档
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 机器学习中为什么要做归一化normalization
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 深入浅出Node.js
  • 使用agvtool更改app version/build
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 一道面试题引发的“血案”
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • # 达梦数据库知识点
  • $.ajax()方法详解
  • $NOIp2018$劝退记
  • (02)vite环境变量配置
  • (7)STL算法之交换赋值
  • (a /b)*c的值
  • (java)关于Thread的挂起和恢复
  • (第二周)效能测试
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (一)插入排序
  • *2 echo、printf、mkdir命令的应用
  • .Net 4.0并行库实用性演练
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .net 获取url的方法
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...