Realm For Android入门教程
各位看客老爷们,很久没更新文章了;最近项目中的数据库那里写的我的确有点恶心了,所以开始看看各种数据库框架,我查了下网上对各种数据库框架的对比分析哈;但是我一眼就看上了你(realm) 可以跨平台,可以轻松的使用json数据,这简直对我来说是神器啊,我都懒得处理数据了,暂时先写个demo,入门吧,来考验下这个,我看网上说了有很多坑,我先踩踩坑~
1、Realm简介
数据库Realm,是用来替代sqlite的一种解决方案,它有一套自己的数据库存储引擎,比sqlite更轻量级,拥有更快的速度,并且具有很多现代数据库的特性,比如支持JSON,流式api,数据变更通知,自动数据同步,简单身份验证,访问控制,事件处理,最重要的是跨平台,目前已有Java,Objective C,Swift,React-Native,Xamarin这五种实现。
2、环境配置
在Progect build中添加:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "io.realm:realm-gradle-plugin:2.0.2"
}
}
在app build中头添加
apply plugin: 'realm-android'
3、在Application中初始化Realm
在Application中初始化,别忘记在AndroidManifest.xml文件中的application声明
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Realm.init(this);
RealmConfiguration config = new RealmConfiguration.Builder()
.name("myRealm") //数据库名字
.schemaVersion(0) //数据库版本号
.build(); //创建
Realm.setDefaultConfiguration(config);
}
}
RealmConfiguration支持的方法:
- Builder.name : 指定数据库的名称。如不指定默认名为default。
- Builder.schemaVersion : 指定数据库的版本号。
- Builder.encryptionKey : 指定数据库的密钥。
- Builder.migration : 指定迁移操作的迁移类。
- Builder.deleteRealmIfMigrationNeeded : 声明版本冲突时自动删除原数据库。
- Builder.inMemory : 声明数据库只在内存中持久化。
- build : 完成配置构建。
4、创建实体
1.现在开始创建第一个demo的实例吧
代码奉上
public class Dog extends RealmObject {
private String name;
private int age;
@PrimaryKey
private int id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
并没有很多东西,顶多是多了个标签(@PrimaryKey)
这就是个普通的javabean啊;相关的其他标签我写在下面啦
1、支持的数据类型:
boolean, byte, short, int, long, float, double, String, Date and byte[]
在Realm中byte, short, int, long最终都被映射成long类型
2、注解说明
@PrimaryKey
①字段必须是String、 integer、byte、short、 int、long 以及它们的封装类Byte, Short, Integer, and Long
②使用了该注解之后可以使用copyToRealmOrUpdate()方法,通过主键查询它的对象,如果查询到了,则更新它,否则新建一个对象来代替。
③使用了该注解将默认设置(@index)注解
④使用了该注解之后,创建和更新数据将会慢一点,查询数据会快一点。
@Required
数据不能为null
@Ignore
忽略,即该字段不被存储到本地
@Index
为这个字段添加一个搜索引擎,这将使插入数据变慢、数据增大,但是查询会变快。建议在需要优化读取性能的情况下使用。
5、增删改查
创建完毕后,我就创建了一个工具类;将数据库的操作都写入里面;
先为各位看客老爷风险上代码:
public class DatabasesManager {
/**
* 增加数据
*/
public static void Add() {
for (int i = 2; i < 10; i++) {
Realm realm = Realm.getDefaultInstance();
realm.beginTransaction();
Dog dog = realm.createObject(Dog.class, i);
dog.setAge(23 + i);
dog.setName("U" + i);
realm.commitTransaction();
}
}
/**
* 删除
*/
public static void Delete() {
Realm realm = Realm.getDefaultInstance();
realm.beginTransaction();
Dog dog = realm.where(Dog.class).equalTo("id", 1).findFirst();
dog.deleteFromRealm();
realm.commitTransaction();
}
/**
* 修改
*/
public static void Update() {
Realm realm = Realm.getDefaultInstance();
Dog dog = realm.where(Dog.class).equalTo("id", 0).findFirst();
realm.beginTransaction();
dog.setName("网二");
realm.commitTransaction();
}
/**
* 查询
*
* @return
*/
public static List<Dog> Quarry() {
Realm realm = Realm.getDefaultInstance();
return realm.where(Dog.class).findAll();
}
}
如上的代码并不是很难的操作;
看到这里是不是感觉很简单呢?
详细讲解下
a. 增
新建一个对象,并进行存储:使用的是Transaction的方式
Realm realm = Realm.getDefaultInstance();
realm.beginTransaction();
Dog dog = realm.createObject(Dog.class, i);
dog.setAge(23 + i);
dog.setName("U" + i);
realm.commitTransaction();
b. 删
Realm realm = Realm.getDefaultInstance();
realm.beginTransaction();
Dog dog = realm.where(Dog.class).equalTo("id", 1).findFirst();
dog.deleteFromRealm();
realm.commitTransaction();
我觉得最主要说的应该是equalTo(String fieldName, Integer value) 这里面的参数;
fieldName:这个是数据库的字段名称——也就是javabean的名字哦
value:你的条件值啊;这个语句就类似于:
delete from table where table.a = (select b where c.filename = value);
c.改
Realm realm = Realm.getDefaultInstance();
Dog dog = realm.where(Dog.class).equalTo("id", 0).findFirst();
realm.beginTransaction();
dog.setName("网二");
realm.commitTransaction();
这个没什么好说的,跟上面跟上面删除的操作类似;
d.查询
Realm realm = Realm.getDefaultInstance();
realm.where(Dog.class).findAll();
哇咔咔,这个是不是太简单了,相对比较我之前写的查询语句,简直简便了多了,2行代码,之前封装完了也不止2行(ps:可能是作者我比较low)
扩展一点点:增加个调价查询;哈哈
想必聪明的你看到这里都知道了,一定是这样的;
Realm realm = Realm.getDefaultInstance();
realm.where(Dog.class).equalTo("id", 0).findFirst();
那么肯定又有人要问了,如果我需要其他条件怎么办啊?小主早就为你准备好了,往下看
常见的条件如下(详细资料请查官方文档):
between(), greaterThan(), lessThan(), greaterThanOrEqualTo() & lessThanOrEqualTo()
equalTo() & notEqualTo()
contains(), beginsWith() & endsWith()
isNull() & isNotNull()
isEmpty() & isNotEmpty()
好啦,Realm简单的入门了解就简单介绍在这里吧,还有一些异步处理本期没有写出来,等我更新哦~
如果你觉得还凑合,还能看的话,那么麻烦你动动你的小手分享出去哦