阅读 120

Android数据库Realm简单使用

最近在项目中使用realm,发现还是很好用方便,他可以直接把json数据插入到数据库,当服务端返回数据时我们不需要解析json,可以直接插入数据库。

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"
    }
}
复制代码

对应的问价位置

2. 在项目的build.gradle文件添加如下

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"
  ...
/>
复制代码
  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

列如:

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);
                }
            });
复制代码

如果插入数据指定了主键,创建的时候需要定义

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();
        }
复制代码
  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官网链接

关注下面的标签,发现更多相似文章
评论