最近在项目中使用realm,发现还是很好用方便,他可以直接把json数据插入到数据库,当服务端返回数据时我们不需要解析json,可以直接插入数据库。
Realm准备
- android studio需要1.5.1以上
- jdk7.0以上
- android2.3以上
将Realm依赖到项目
- 在项目的根目录的build.gradle添加如下
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "io.realm:realm-gradle-plugin:5.13.0"
}
}
对应的问价位置

apply plugin: 'realm-android'
文件位置

如果项目配置了kotlin, 还需要在项目的build.gradle配置 apply plugin: 'kotlin-kapt'
Realm开始使用
1.首先需要重写项目Application
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Realm.init(this);
}
}
清单文件配置
<application
android:name=".MyApplication"
...
/>
- realm配置数据库名称或者版本号,可以使用默认配置,也可以自定义
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Realm.init(this);
RealmConfiguration config = new RealmConfiguration.Builder()
.name("myrealm.realm")//数据库名称
.build();
Realm.setDefaultConfiguration(config);
}
}
realm建表使用Models,需要继承RealmObject
列如:
public class User extends RealmObject {
public String username;
public String password;
}
插入数据
- realm写入数据需要放在事务中,否则会抛异常
// 获的realm
Realm realm = Realm.getDefaultInstance();
realm.beginTransaction();
//在这里里面插入或者更新
User user = realm.createObject(User.class);//插入数据
user.username="xxx"
realm.commitTransaction();
如果觉得这种比较麻烦,可以使用realm提供的代码块
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(@NotNull Realm realm) {
User user = realm.createObject(User.class);//插入数据
user.username="xxx"
realm.createObject(userBean);
}
});
如果插入数据指定了主键,创建的时候需要定义
public class User extends RealmObject {
@PrimaryKey
public String id ;
public String username;
public String password;
}
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(@NotNull Realm realm) {
User user = realm.createObject(User.class,UUID.randomUUID().toString());
//user.id="1234"//会报错,需要new的时候定义
user.username="xxx"
realm.createObject(userBean);
}
});
realm使用完成需要关掉
if (mRealm != null && !mRealm.isClosed()) {
mRealm.close();
}
- 通过json直接插入数据
// A RealmObject that represents a city
public class City extends RealmObject {
private String city;
private int id;
// getters and setters left out ...
}
//单个插入
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.createObjectFromJson(City.class, "{ city: \"Copenhagen\", id: 1 }");
}
});
//多个插入
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.createAllFromJson(City.class, "[{ city: \"Copenhagen\", id: 1 },{ city: \"beijing\", id: 2 }]");
}
});
- 上面的插入数据为同步插入,异步插入可以采用线程,AsyncTask等,也可以使用异步事务
mRealm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(@NotNull Realm realm) {
User user = realm.createObject(User.class);//插入数据
user.username="xxx"
realm.createObject(userBean);
}
}, new Realm.Transaction.OnSuccess() {
@Override
public void onSuccess() {
//成功回调
}
}, new Realm.Transaction.OnError() {
@Override
public void onError(@NotNull Throwable error) {
//失败回调
}
});
查找数据
- 同步查找
//查找所有用户
RealmResults<User> result = realm.where(User.class)
.equalTo("username", "John")// 查询条件
.or()
.equalTo("username", "Peter")// 查询条件
.findAll();
RealmResults<User> result1 =result.sort("排序字段", Sort.DESCENDING);//根据某个字段倒序
2.异步查找
RealmAsyncTask transaction = realm.where(User.class).findAllAsync();
result.addChangeListener(mCallBack);
//该回调不仅在查询完成后调用,当对user进行更新事也会回调
private OrderedRealmCollectionChangeListener<RealmResults<User>> mCallBack =
new OrderedRealmCollectionChangeListener<RealmResults<User>>() {
@Override
public void onChange(@NotNull RealmResults<User> assetsManagerBeans,
@NotNull OrderedCollectionChangeSet changeSet) {
if (changeSet.isCompleteResult()) {
//回到主线程
}
}
};
当不在使用该回调是需要在 Activity or Fragment清除
public void onStop () {
if (transaction != null && !transaction.isCancelled()) {
transaction.cancel();
}
result.removeChangeListener(mCallBack); // remove a particular listener
// or
result.removeAllChangeListeners(); // remove all registered listeners
}
3.RealmResults集成了list 但是他只能get,不能修改集合 比如add或者addAll clear
更新数据(更新数据需要在事务中完成)
例如将用户密码都改成123 1.同步更新
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
RealResults<user> user = realm.where(user.class).findAll();
user.setString("password", "123");//还有更多中set类型,如setBoolean ,setInt等等...
}
});
3.异步更新采用异步事务 4.更新某一条数据
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
user user = realm.where(user.class).equalTo("id", personId).findFirst();
user.password="456";
}
});
5.json批量更新到数据库
mRealm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(@NotNull Realm realm) {
//通过jsonArray
realm.createOrUpdateAllFromJson(AssetsManagerBean.class, jsonArray);
或者
String json="[{ name: "xxx", id: 1 },{ name: "xxx", id: 2 }]"
realm.createOrUpdateAllFromJson(AssetsManagerBean.class, json);
}
}, new Realm.Transaction.OnSuccess() {
@Override
public void onSuccess() {
}
}, new Realm.Transaction.OnError() {
@Override
public void onError(@NotNull Throwable error) {
}
});
删除数据
// obtain the results of a query
final RealmResults<User> results = realm.where(User.class).findAll();
// All changes to data must happen in a transaction
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
// 删除单个
results.deleteFirstFromRealm();
results.deleteLastFromRealm();
// 删除某一个
User User = results.get(5);
User.deleteFromRealm();
// 删除所有
results.deleteAllFromRealm();
}
});