android 使用Realm数据库
写在前面:我们再做一个三端的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 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 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();
更多相关文章
- 一款常用的 Squid 日志分析工具
- GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
- “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
- Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
- RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
- Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
- 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
- 四、Android.mk之编译生成可执行文件
- android AVD 启动时报错(emulator: erroremulator:ERROR:This AVD'