写在前面:我们再做一个三端的UI以及api的框架,其中数据库部分想采用realm,但前期参考不够全面,暂时得知的realm知识点不足以把这个框架进行下去,导致没有结合于react-native。总结为没有找到realm执行sql语句很好的方式。或者说realm不支持执行sql?
正题
官方网站
realm不支持android之外的java,切不支持eclipse,要使用as。
安装
1.在项目级build.gradle文件中的dependencies 模块添加
classpath "io.realm:realm-gradle-plugin:5.8.0"
2.在应用级build.gradle文件中添加
apply plugin: 'realm-android'
代码
在Application的onCreate中初始化
初始化有两种方式:
1.默认方式
Realm.init(this);
RealmConfiguration config = new RealmConfiguration.Builder().build();
Realm.setDefaultConfiguration(config);
这种方式会默认生成一个default.realm的文件。
2.定义数据库名字、版本等等
Realm.init(this);
RealmConfiguration bksx_xx_db = new RealmConfiguration.Builder().name("bksx_xx_db.realm").build();
Realm.setDefaultConfiguration(bksx_xx_db);
如果用模拟器可以在as的菜单中点击VIew > Tool Windows > Device File Explorer 可以找模拟器的文件储存位置,这个文件在data/data/包名下找到。
其中这个RealmConfiguration还有一些其他属性可供使用
Builder.name : 指定数据库的名称。如不指定默认名为default。
Builder.schemaVersion : 指定数据库的版本号。
Builder.encryptionKey : 指定数据库的密钥。
Builder.migration : 指定迁移操作的迁移类。
Builder.deleteRealmIfMigrationNeeded : 声明版本冲突时自动删除原数据库。
Builder.inMemory : 声明数据库只在内存中持久化。
build : 完成配置构建。
在我的测试中当完成本步骤时,数据库文件并没有产生(也可能是ddms迟钝的原因),当我添加数据后才看到文件
创建实体类
这个实体类应和和数据格式一一对应,而在realm中是根据这个实体类创建的表结构key。
这个实体类要继承RealmObject,事实上在增删改查的操作中也是使用这个类中的方法来操作的。
public class Dog extends RealmObject {
private String name;
private int age;
private String id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
增加数据
Realm realm = Realm.getDefaultInstance();
realm.beginTransaction();
Dog dog = realm.createObject(Dog.class);
dog.setAge(7);
dog.setId("777");
dog.setName("YOU WILL.");
realm.commitTransaction();
删除数据
Realm realm = Realm.getDefaultInstance();
RealmResults<Dog> dogs = realm.where(Dog.class).findAll();
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
// dogs.deleteFromRealm(0);
// dogs.deleteLastFromRealm(); //删除最后一条
// dogs.deleteFirstFromRealm(); //删除第一条
dogs.deleteAllFromRealm();
}
});
其中的delete…Realm()等方法就是我们实体类所继承的父类中的方法了。
更改数据
Realm realm = Realm.getDefaultInstance();
// Dog id = realm.where(Dog.class).equalTo("id", "777").findFirst(); //只查一个
RealmResults<Dog> all = realm.where(Dog.class).equalTo("id", "777").findAll();
realm.beginTransaction();
for (int i = 0; i < all.size(); i++) {
all.get(i).setAge(99);
}
realm.commitTransaction();
更改数据我用了条件更改 .equalTo(“id”,“777”).findFirst(); 更改id为“777”的一条数据,如果用.findAll();是更改所有满足条件的数据。这里的for循环应该可以改成更好的方式替换数据。
查询数据
其实上边已经体现出来了
Dog id = realm.where(Dog.class).equalTo("id", "777").findAll();