Realm for Android 的使用

本文介绍了Realm数据库的基本使用方法,包括环境配置、初始化、实体创建、增删改查等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

介绍

Realm 是一个手机数据库,是用来替代 SQlite 的解决方案,比 SQlite 更轻量级,速度更快,因为它有一套自己的数据库搜索引擎,并且还具有很多现代数据库的优点,支持 JSON,流式 API 调用,数据变更通知,自动数据同步,简单身份验证,访问控制,事件处理,最重要的是跨平台,目前已经支持 Java、Swift、Object - C、React - Native 等多种实现,今天我们就来简单的入门 Ream 数据库的使用

GitHub 地址:Realm GitHub 地址

官方文档地址:官方文档地址

优势

如果在在使用它时候,连它的优势在哪都不知道的话就有点说不过去了。

  • 易用
    Ream 不是在SQLite基础上的ORM,它有自己的数据查询引擎。并且十分容易使用。
  • 快速
    由于它是完全重新开始开发的数据库实现,所以它比任何的ORM速度都快很多,甚至比SLite速度都要快。
  • 跨平台
    Realm 支持 iOS & OS X (Objective‑C & Swift) & Android。我们可以在这些平台上共享Realm数据库文件,并且上层逻辑可以不用任何改动的情况下实现移植。
  • 高级
    Ream支持加密,格式化查询,易于移植,支持JSON,流式api,数据变更通知等高级特性
  • 可视化
    Realm 还提供了一个轻量级的数据库查看工具,在Mac Appstore 可以下载“Realm Browser”这个工具,开发者可以查看数据库当中的内容,执行简单的插入和删除数据的操作。(windows上还不清楚)

使用要求

首先使用 Realm 的一些使用要求我们还是需要先来了解

  • Android Studio 的使用版本必须在 1.5.1 或更高
  • 使用 JDK 7 或更高版本
  • Android API 9 或更高(即 Android 2.3 及以上)
  • Realm 不在 Android 支持 Java,不支持 Eclipse 作为 IDE,如果使用请转到 Android Studio

二、环境配置

在了解 Realm 在 Andorid 中的基本使用要求之后,接下来我们来看看,如何在 Android Studio 中来引入 Realm

1)首先在工程的根目录(project) build.gradle 中引入如下代码,注意是工程的 build.gradle 而不是 app 的 build.gradle

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'

        classpath "io.realm:realm-gradle-plugin:3.0.0"//realm数据库
    }
}

2)在 app(或者依赖的library的) build.gradle 顶部添加如下代码


当上面的这两步做好以后,可以刷新我们的 Gradle 依赖,如果你是通过 v 0.88 以前的版本来更新,你需要去清理一下你的 Gradle 项目(./gradlew clean),来移除之前的安装,另外对 Maven 和 Ant 并不支持

三、官方推荐的例子

introExample:包括了简单的例子,让你知道如何去使用当前的 API

gridViewExample:一个简单的 APP,来展示怎么通过 Realm 来支持 GridView 的存储,同时它还呈现了如何构建一个 JSON 的数据库(通过 GSON)

thread Example :简单展示如何在多线程中使用 Realm

adapterExample:如何通过使用 RealmBaseAdapter 和 RealmRecyclerViewAdapter 来使 Realm 以优雅的方式作用于 ListView 和 RecyclerView

jsonExample:如何使用一种新的 Realm JSON 工具

encryptionExample:如何使用加密 Realms

rxJavaExample:如何搭配 RxJava 来使用 Realm

UnitTestExample:教你在使用 Realm 时如何编写单元测试

四、初始化 Realm

1)在 Applaction 的 onCreate() 方法中使用 Realm.init() 初始化

[java]  view plain  copy
  1. public class MyApplication extends Application {  
  2.   @Override  
  3.   public void onCreate() {  
  4.     super.onCreate();  
  5.     Realm.init(this);  
  6.   }  
  7. }  

2)在 Applaction的onCreate() 方法中对 Realm 进行相关的配置

1. 使用默认配置:

  1. Realm.init(this);  
  2. Realm mRealm = Realm.getDefaultInstance();  

或者如下:

  1. public class MyApplication extends Application {  
  2.   @Override  
  3.   public void onCreate() {  
  4.     super.onCreate();  
  5.     // The default Realm file is "default.realm" in Context.getFilesDir();  
  6.     // we'll change it to "myrealm.realm"  
  7.     Realm.init(this);  
  8.     RealmConfiguration config = new RealmConfiguration.Builder().name("myrealm.realm").build();  
  9.     Realm.setDefaultConfiguration(config);  
  10.   }  
  11. }  
使用默认配置会创建一个 default.realm 的 Realm 文件,一般来说这个文件位于 data/data/包名/files 目录下,通过 realm.getPath 来获得该 Realm 的绝对路径

2. 使用自定义配置:

  1. RealmConfiguration config = new RealmConfiguration.Builder()   
  2.             .name("myrealm.realm"//文件名  
  3.             .schemaVersion(0//版本号  
  4.             .build();  
  5. Realm realm = Realm.getInstance(config);  

3. 创建非持久化的 realm,也就是保存在内存中,应用关闭后就清除

  1. RealmConfiguration myConfig = new RealmConfiguration.Builder(context)   
  2.             .name("myrealm.realm")//保存在内中  
  3.             .inMemory()  
  4.             .build();  
RealmConfiguration 支持的方法:

Builder.name:指定数据库的名称,如果不指定默认为 default

Builder.schemaVersion:指定数据库的版本号

Builder.encryptionkey:指定数据库的秘钥

Builder.migration:指定迁移操作的迁移类

Builder.deleteRealmIfMigrationNeeded:声明版本冲突时自动删除原数据库

Builder.inMemory:声明数据库只在内存中持久化

build:完成配置构建


如果你像以上一样创建了自己的 Application,并初始化 Realm,那么你需要在 Andorid.manifest.xml 中进行如下配置:

  1. <application  
  2.   android:name=".MyApplication"  
  3.   ...  
  4. />  
3)在 Activity 中具体的使用:
  1. public class MyActivity extends Activity {  
  2.   @Override  
  3.   protected void onCreate(Bundle savedInstanceState) {  
  4.     super.onCreate(savedInstanceState);  
  5.     Realm realm = Realm.getDefaultInstance(); // opens "myrealm.realm"  
  6.     try {  
  7.       // ... Do something ...  
  8.     } finally {  
  9.       realm.close();  
  10.     }  
  11.   }  
  12. }  

或者使用完后在 onDestory() 方法中进行关闭:

  1. @Override   
  2. protected void onDestroy() {   
  3.     super.onDestroy();  
  4.     // Close the Realm instance.   
  5.     realm.close();   
  6. }  

四、创建实体

创建一个 User 类,继承 RealmObject

  1. public class User extends RealmObject {  
  2.     private String name;  
  3.     private int age;  
  4.   
  5.     public String getName() {  
  6.         return name;  
  7.     }  
  8.   
  9.     public void setName(String name) {  
  10.         this.name = name;  
  11.     }  
  12.   
  13.     public int getAge() {  
  14.         return age;  
  15.     }  
  16.   
  17.     public void setAge(int age) {  
  18.         this.age = age;  
  19.     }  
  20. }  
这里除了通过继承 RealmObject 来声明数据模型外,还可以通过实现 RealmModel 接口,并添加 @RealmClass 修饰符来声明:
  1. @RealmClass  
  2. public class User implements RealmModel {  
  3.     ...  
  4. }  

多对多的关系:

  1. public class User extends RealmObject {  
  2.     public String name;  
  3.     public RealmList<Email> emails;  
  4. }  
  5.   
  6. public class Email extends RealmObject {  
  7.     public String address;  
  8.     public boolean active;  
  9. }  

支持的属性:

boolean、byte、short、int、long、float、double、String、Date、byte[]、RealmObject、RealmList<? extends RealmObject>,还支持 Boolean、Byte、Short、Integer、Long、Float 和 Double


@primarykey:表示该字段是主键,一般使用过数据库的同学可能知道,primarykey 就是主键,使用 @primarykey 来标注字段类型必须是字符串(String)或整数(byte、short、int、long)以及它们的包装类型(Byte、Short、Integer、Long),还需要注意的是不可以使用多个主键

  1. @PrimaryKey  
  2. private String id;  

@Required:表示该字段非空

在某些情况下,有些字段是不能为 null 的,使用 @Required 属性可以强行要求其属性不能为 null,只能用于 Boolean、Byte、Short、Integer、Long、Float、Double、String、byte[] 和 Date,在其他类型属性上使用 @Required 会导致编译失败

  1. @Required  
  2. private String name;  
@Ignore: 表示忽略该字段,添加 @Ignore 标签后,存储数据时会忽略该字段
  1. @Ignore  
  2. private String name;  

@Index:添加搜索索引,为字段添加 @Index 标签,插入速度变慢,查询速度变快,支持索引 String、byte、short、int、long、boolean 和 Date字段

五、增


1) 实现方法一:事务操作

类型一:新建一个对象进行存储

  1. mRealm.beginTransaction();  
  2. User user = mRealm.createObject(User.class); // Create a new object  
  3. user.setName("John");  
  4. user.setEmail("john@corporation.com");  
  5. mRealm.commitTransaction();  
类型二:复制一个对象到数据库
  1. User user = new User("John");  
  2. user.setEmail("john@corporation.com");  
  3.   
  4. // Copy the object to Realm. Any further changes must happen on realmUser  
  5. mRealm.beginTransaction();  
  6. mRealm.copyToRealm(user);  
  7. mRealm.commitTransaction();  

2) 实现方法二:使用事务块

  1. Realm  mRealm=Realm.getDefaultInstance();  
  2.   
  3. final User user = new User("John");  
  4. user.setEmail("john@corporation.com");  
  5.   
  6. mRealm.executeTransaction(new Realm.Transaction() {  
  7.             @Override  
  8.             public void execute(Realm realm) {  
  9.               
  10.             realm.copyToRealm(user);  
  11.                  
  12.             }  
  13.         });  

六、删

1) 使用 deleteFromRealm()

  1. //先查找到数据  
  2. final RealmResults<User> userList = mRealm.where(User.class).findAll();  
  3. mRealm.executeTransaction(new Realm.Transaction() {  
  4.   @Override  
  5.   public void execute(Realm realm) {  
  6.       userList.get(0).deleteFromRealm();  
  7.   }  
  8. });  

2) 使用 deleteFromRealm(int index)

  1. mRealm.executeTransaction(new Realm.Transaction() {  
  2.   @Override  
  3.   public void execute(Realm realm) {  
  4.       userList.deleteFromRealm(0);  
  5.   }  
  6. });  

3) 其他方法

  1. userList.deleteFirstFromRealm(); //删除user表的第一条数据  
  2. userList.deleteLastFromRealm();//删除user表的最后一条数据  
  3. results.deleteAllFromRealm();//删除user表的全部数据  

七、改

  1. mRealm.executeTransaction(new Realm.Transaction() {  
  2.     @Override  
  3.     public void execute(Realm realm) {  
  4.         //先查找后得到User对象  
  5.         User user = mRealm.where(User.class).findFirst();  
  6.         user.setAge(26);  
  7.     }  
  8. });  

八、查

查询的操作相对来说比较多,下面我们来一一介绍

1) findAll:查询所有,如查询所有 User

  1. RealmResults<User> userList = mRealm.where(User.class).findAll();  
2) findFirst:查询第一条数据,示例如下
  1. User user2 = mRealm.where(User.class).findFirst();  
3) equalTo:根据条件查询,例得到命名为  qdj 的列表
  1. RealmResults<User> userList = mRealm.where(User.class)  
  2.          .equalTo("name""qdj").findAll();  
还有很多其他的方法如下:

sum():对指定字段求和

average():对指定字段求平均值

min():对指定字段求最小值

max():对指定字段求最大值

findAll():返回结果集所有字段

findAllSorted():排序返回结果集所有字段等等方法,还有很多,这里不再一一列举,用到时大家可以去官网查询相关的 API


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值