安卓数据库框架——Realm基础学习

安卓数据库框架——Realm基础学习

参考:

http://blog.5ibc.net/p/96511.html

http://www.jianshu.com/p/37af717761cc

https://realm.io/cn/docs/java/latest/#section-1

 

安卓数据库框架简介:

当我们的app有数据需要保存到本地缓存时,可以使用file,sharedpreferences,还有sqlite。sharedpreferences其实使用xml的方式,以键值对形式存储基本数据类型的数据。对于有复杂筛选查询的操作,file和sharedpreferences都不能满足了。

sqlite可以满足有大量复杂查询要求的缓存数据操作。但是sqlite的使用略复杂,代码量很大,还好网上有很多优秀的orm框架Object Relational Mappin可使用,比喻ORMlite,greenDao等。

ORMlitegreenDao这些框架都是在SQLite的基础上封装的ORM对象关系映射框架,简化了代码操作。

Realm是一个可以替代SQLite以及ORM Libraries的轻量级数据库他的核心数据引擎C++打造。相比SQLite,Realm更快并且具有很多现代数据库的特性,比如支持JSON,流式api,数据变更通知,以及加密支持,这些都为安卓开发者带来了方便。

性能对比


所以看来realm其实是完胜的,所以于情于理感觉还是准备将realm作为以后项目的数据库框架来使用。

Realm的使用

引入

第一步:

在最外层project的build.gradle中配置

dependencies{

        classpath"io.realm:realm-gradle-plugin:3.1.1"

    }

第二部:

在app的build.gradle中配置

apply plugin:'realm-android'

然后就可以用了。

 

数据模型

我们对要用realm进行存储的数据的数据需要继承RealmObject。

publicclassUserextendsRealmObject{

 

    privateString         name;

    privateint            age;

 

    @Ignore

    privateint            sessionId;

 

    // Standard getters & setters generated by your IDE…

    publicStringgetName(){returnname;}

    publicvoid  setName(Stringname){this.name=name;}

    publicint   getAge(){returnage;}

    publicvoid  setAge(intage){this.age=age;}

    publicint   getSessionId(){returnsessionId;}

    publicvoid  setSessionId(intsessionId){this.sessionId=sessionId;}

}

数据的修饰符

@Required

修饰类型和空值(null),禁止数据为null,否则编译会失败。

 @Ignore 

意味着一个字段不应该被保存到 Realm。

@Index

为字段增加搜索索引,这会导致插入速度变慢,同时数据文件体积有所增加,

@PrimaryKey

定义字段为主键。使用 copyToRealmOrUpdate() 方法,它会用此主键尝试寻找一个已存在的对象,如果对象存在,就更新该对象;反之,它会创建一个新的对象。当 copyToRealmOrUpdate() 的调用对象没有主键时,会抛出异常。

数据之间的关系:

publicclassPersonextendsRealmObject{

  privateStringid;

  privateStringname;

  privateRealmList<Dog>dogs;

  //getters and setters

}

 

publicclassDogextendsRealmObject{

  privateStringid;

  privateStringname;

  privateStringcolor;

  //getters and setters

}

realm.executeTransaction(newRealm.Transaction(){

    @Override

    publicvoidexecute(Realmrealm){

        PersonmPerson=realm.createObject(person.class);

        mPerson.name="John Doe";

 

        DogmDog1=realm.createObject(Dog.class);

        mDog1.name="hehe";

        mDog1.color=red;

        mPerson.dogs.add(mDog1);

 

       DogmDog2=realm.createObject(Dog.class);

        mDog2.name="lalalla";

        mDog2.color=red;

        mPerson.dogs.add(mDog2);

    }

});

这样其实产生了相互关联的两张表,person和dog。

Realm的配置

创建realm:

创建realm数据库操作对象:

RealmConfigurationmyConfig = new RealmConfiguration.Builder()

  .name("myrealm.realm") // 数据库名字

  .schemaVersion(2)

  .modules(new MyCustomSchema())

  .build();

 

RealmConfigurationotherConfig = new RealmConfiguration.Builder()

  .name("otherrealm.realm")

  .schemaVersion(5)

  .modules(new MyOtherSchema())

  .build();

 

RealmmyRealm = Realm.getInstance(myConfig);

RealmotherRealm = Realm.getInstance(otherConfig);

我们同时可以创建多个realm,他们默认存储在Context.getFilesDir()

下。

配置默认realm

Realm.setDefaultConfiguration(configuration);

这样我们就设置了默认的realm,在全局取用的时候就比较方便:

Realm.getDefaultInstance();

直接就拿到了默认的realm对象。

关闭realm对象

realm realm.close();

 

其他配置选项

RealmConfigurationmyConfig=newRealmConfiguration.Builder()

    .name("myrealm.realm")

    .inMemory()

    .build();

创建一个存在于“内存中的” Realm。“内存中的”Realm 在内存紧张的情况下仍有可能使用到磁盘存储,但是这些磁盘空间都会在Realm实例完全关闭的时候被释放。

 

增删改查

增加
普通增加

普通增加1:

realm.beginTransaction();

Useruser=realm.createObject(User.class);// Create a new object

user.setName("John");

user.setEmail("john@corporation.com");

realm.commitTransaction();

普通增加2:

Useruser=newUser("John");

user.setEmail("john@corporation.com");

 

realm.beginTransaction();

UserrealmUser=realm.copyToRealm(user);

realm.commitTransaction();

当使用 realm.copyToRealm() 时,请注意只有返回的对象是由 Realm 管理的,这非常重要。对原始对象(umanaged Object)的任何改变都不会写入 Realm.

 

代码块增加

realm.executeTransaction(newRealm.Transaction(){

        @Override

        publicvoidexecute(Realmrealm){

               Useruser=realm.createObject(User.class);

               user.setName("John");

               user.setEmail("john@corporation.com");

        }

});

 

异步增加

realm.executeTransactionAsync(newRealm.Transaction(){

    @Override

    publicvoidexecute(RealmbgRealm){

        Useruser=bgRealm.createObject(User.class);

        user.setName("John");

        user.setEmail("john@corporation.com");

    }

},newRealm.Transaction.OnSuccess(){

    @Override

    publicvoidonSuccess(){

        // Transaction was a success.

    }

},newRealm.Transaction.OnError(){

    @Override

    publicvoidonError(Throwableerror){

        // Transaction failed and was automatically canceled.

    }

});

查询
查询的相关条件

相等:

equalTo()

notEqualTo()

in():在某组数值中

eg:in("name", new String[]{"Jill","William", "Trillian"})

比较:

between()

greaterThan()

lessThan()

greaterThanOrEqualTo()

lessThanOrEqualTo()

对string的比较查询:

contains()

beginsWith()

endsWith()

like()

“()”内的参数为(字段名,查询内容)

 

 

普通查询:

// Or alternatively do the same all at once (the "Fluentinterface"):

RealmResults<User>result2=realm.where(User.class)

                                  .equalTo("name","John")

                                  .or()

                                  .equalTo("name","Peter")

                                  .findAll();

 

关联查询:

这个是person和dog的例子

// persons => [U1,U2]

RealmResults<Person>persons=realm.where(Person.class)

                                .equalTo("dogs.color","Brown")

                                .findAll();

异步查询

RealmResults<User>result=realm.where(User.class)

                              .equalTo("name","John")

                              .or()

                              .equalTo("name","Peter")

                              .findAllAsync();

result.addChangeListener(callback); // 添加监听

 

删除:
普通删除:

在查询到对应的结果之后进行删除。

realm.executeTransaction(newRealm.Transaction(){

    @Override

    publicvoidexecute(Realmrealm){

        // 删除单个匹配

        results.deleteFirstFromRealm();

        results.deleteLastFromRealm();

 

        // 删除单个对象

        Dogdog=results.get(5);

        dog.deleteFromRealm();

 

        // 删除所有查询到的对象

        results.deleteAllFromRealm();

    }

});

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值