Realm数据库使用

Realm使用详解

听首歌先
Nod To It

本来是说是一周一更新的,但是最近确实事情太多了。
写这些文章主要是对自己平时的工作学习做一个记录,也让自己温故知新。

话不多说,正文开始:

数据库Realm,是用来替代sqlite的一种解决方案,它有一套自己的数据库存储引擎,比sqlite更轻量级,拥有更快的速度,并且具有很多现代数据库的特性,比如支持JSON,流式api,数据变更通知,自动数据同步,简单身份验证,访问控制,事件处理,最重要的是跨平台,目前已有Java,Objective C,Swift,React-Native,Xamarin这五种实现。

Realm官方文档

集成到Android Studio

  • Add the class path dependency to the project level build.gradle file.
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath "io.realm:realm-gradle-plugin:3.0.0"
    }
}
  • Apply the realm-android plugin to the top of the application level build.gradle file.
apply plugin: 'realm-android'

基本使用

  • Realm model classes are created by extending the RealmObject base class.

意思说我们的实体类需要继承RealmObject ,并指定一个PrimaryKey.
PrimaryKey必须唯一

  • Field types

其中支持的数据类型有:boolean、short、int、long、float、double、byte[]、String、data、Any RealmObject subclass、RealmList.
RealmList像是Java的List,是一个容器,我们可以利用它来构建一对多的关系。

  • Annotations
  1. @PrimaryKey设置主键,主键必须唯一。我们使用了主键后,可以通过copyToRealmOrUpdate()方法去查询对象,如果查询到了则更新,否则新建一个对象来代替。但是有个弊端:使用主键注解后,创建和更新数据会慢一点,查询会快一点。
  2. @Required是强制某个字段数据不能为null
  3. @lgnore 忽略,即该字段不会被存储到本地
  4. @Index,为使用此注解的字段添加一个搜索引擎。插入数据的时候会变慢,查询的速度会变快,适用于优化读取性能的应用场景。
  • 增删改查的事务操作

    • 初始化Realm

    有两种方式来初始化Realm
    //默认初始化
    mRealm = Realm.getDefaultInstance();
    //自定义配置
    RealmConfiguration configuration = new RealmConfiguration.Builder()
    .inMemory() //数据存在内存中,不写入硬盘,随着应用退出所存数据会被删除
    .schemaVersion(1) //设置数据库的版本号
    .rxFactory(new RealmObservableFactory()) //支持RxJava
    .name(“Leo”) //数据库名字
    .deleteRealmIfMigrationNeeded()
    .build();
    mRealm = Realm.getInstance(configuration);

    • 插入
             public void addPerson(final Person person) 
             {
              mRealm.beginTransaction();
              mRealm.copyToRealm(person);
              mRealm.commitTransaction();
              }
    
- 删除

public void deletePerson(String id)
{
Person person = mRealm.where(Person.class).equalTo(“id”, id).findFirst();
mRealm.beginTransaction();
person.deleteFromRealm();
mRealm.commitTransaction();
}

- 修改

public void updatePerson(String id, String newName)
{
Person person = mRealm.where(Person.class).equalTo(“id”, id).findFirst();
mRealm.beginTransaction();
person.setName(newName);
mRealm.commitTransaction();
}

- 查询
     (1). 查询所有
     ```
        public List<Person> queryAllPerson() 
        {
       RealmResults<Person> persons = mRealm.where(Person.class).findAll();
       /**
        * 对查询结果,按Id进行排序,只能对查询结果进行排序
        */
       //增序排列
       persons = persons.sort("id");
//        //降序排列
//        persons=persons.sort("id", Sort.DESCENDING);
       return mRealm.copyFromRealm(persons);
         }
     ```
     (2).通过某一个属性查询 
   ```
      public Person queryPersonById(String id) 
      {
       Person person = mRealm.where(Person.class).equalTo("id", id).findFirst();

       return person;
       }
   ``` 
     (3).模糊查询
   ```
public List<Person> queryContains() 
   {
       RealmResults<Person> persons = mRealm
       .where(Person.class)
       .contains("name", "J")
       .findAll();
       return persons;
   }
   ```
   (4).范围查询

public List<Person> queryBetween()
{
RealmResults<Person> age = mRealm
.where(Person.class)
.between(“age”, 10, 20)
.findAll();
return age;
}

  (5).分组查询

public List<Person> queryGroup()
{
RealmResults<Person> r = mRealm.where(Person.class)
.greaterThan(“age”, 10) // implicit AND
.beginGroup()
.equalTo(“name”, “Jack”)
.or()
.contains(“name”, “Leo”)
.endGroup()
.findAll();
return r;
}


> 异步事务操作的话,可以去看看官方的文档,写的也很详细。示例[RealmDemo](https://github.com/LeXiaoWen/RealmDemo)已上传至github.




    原文作者:乐小文
    原文地址: https://www.jianshu.com/p/89b571fb52ad
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞