最近在項目中使用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();
}
});
複製代碼