最近在项目中使用realm,发现仍是很好用方便,他能够直接把json数据插入到数据库,当服务端返回数据时咱们不须要解析json,能够直接插入数据库。java
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "io.realm:realm-gradle-plugin:5.13.0"
}
}
复制代码
对应的问价位置android
apply plugin: 'realm-android'
复制代码
文件位置数据库
若是项目配置了kotlin, 还须要在项目的build.gradle配置 apply plugin: 'kotlin-kapt' json
1.首先须要重写项目Applicationbash
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Realm.init(this);
}
}
复制代码
清单文件配置app
<application
android:name=".MyApplication"
...
/>
复制代码
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);
}
}
复制代码
列如:dom
public class User extends RealmObject {
public String username;
public String password;
}
复制代码
// 获的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);
}
});
复制代码
若是插入数据指定了主键,建立的时候须要定义ide
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使用完成须要关掉gradle
if (mRealm != null && !mRealm.isClosed()) {
mRealm.close();
}
复制代码
// 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 }]");
}
});
复制代码
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();
}
});
复制代码