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.




最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容