Android數據庫Realm簡單使用

最近在項目中使用realm,發現仍是很好用方便,他能夠直接把json數據插入到數據庫,當服務端返回數據時咱們不須要解析json,能夠直接插入數據庫。java

Realm準備

  • android studio須要1.5.1以上
  • jdk7.0以上
  • android2.3以上

將Realm依賴到項目

  1. 在項目的根目錄的build.gradle添加以下
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath "io.realm:realm-gradle-plugin:5.13.0"
    }
}
複製代碼

對應的問價位置android

2. 在項目的build.gradle文件添加以下

apply plugin: 'realm-android'
複製代碼

文件位置數據庫

若是項目配置了kotlin, 還須要在項目的build.gradle配置 apply plugin: 'kotlin-kapt' json

Realm開始使用

1.首先須要重寫項目Applicationbash

public class MyApplication extends Application {
  @Override
  public void onCreate() {
    super.onCreate();
    Realm.init(this);
  }
}
複製代碼

清單文件配置app

<application
  android:name=".MyApplication"
  ...
/>
複製代碼
  1. 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

列如:dom

public class User extends RealmObject {
    public String username;

    public String password;
}
複製代碼

插入數據

  1. 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);
                }
            });
複製代碼

若是插入數據指定了主鍵,建立的時候須要定義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();
        }
複製代碼
  1. 經過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 }]");
    }
});


複製代碼
  1. 上面的插入數據爲同步插入,異步插入能夠採用線程,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) {
               //失敗回調
            }
        });
複製代碼

查找數據

  1. 同步查找
//查找全部用戶
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();
    }
});
複製代碼

realm官網連接

相關文章
相關標籤/搜索