Android数据库Realm学习(一)基本使用

来源:互联网 发布:数控铣床编程100例图 编辑:程序博客网 时间:2024/05/22 12:51

Android数据库Realm学习(一)基本使用


Realm Java文档   技术文档,开卷有益

刚刚开始用Realm,肯定是要对比着SQLite来琢磨的,说几个个人认识:

一、SQLite中的数据库名对应Realm的啥

Realm可以简单直接使用,这个时候似乎是弱化了数据库名的存在,也就是这个时候的数据库文件是默认的default.realm。弱化不代表不用,在实现RealmConfiguration时,通过如下代码new RealmConfiguration.Builder(context).name("myrealm.realm")来控制和指定名字

 

二、表名去了哪里?

这个开始也会有点纠结,就是转不过来这个思维。

继承RealmObject的类也可以理解为一张张表的类。这个应该是在实体类和数据库的表结构之间做了个平衡,一个很惊喜的平衡。虽然也带了一个问题:加到gettersetter的任何自定义逻辑实际上并不会被执行。

 

三、有没有再次封装的必要性?

这个不确定,应该有,但是像查询来说,realm的实现已经够简单了,封装感觉鸡肋点。

 


接下来开始使用了    

1.在modulegradle中添加compile 'io.realm:realm-android:0.87.5'

2.随便搞个什么类,但是要继承RealmObject

例如我声明个Book.class,包括nameauthor两条私有属性,原因如下:


3.然后再activity里面使用realm

本来可以这样的

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. realm = Realm.getInstance(this);  


但是,为了后续学习也为了不装X,先配置个RealmConfiguration好了。

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <RealmConfiguration configuration = new RealmConfiguration.Builder(this)  
  2.                 .name("test.realm")//配置名字  
  3.                 .encryptionKey(new byte[64])//加密用字段,不是64位会报错  
  4.                 .schemaVersion(2)//版本号  
  5. //                .setModules(xxxx)//不懂  
  6. //                .migration(xxxx)//不懂  
  7. //                .inMemory()//设置后会放在缓存中  
  8.                 .build();  
  9.         realm = Realm.getInstance(configuration);  

注意:不同的activity使用同一个.realm文件时配置必须相同;

          所有操作都必须在事务内执行;


具体操纵:

①增

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. //添加一条数据到数据库  
  2.     private void realmInsert(Realm realm) {  
  3.         realm.beginTransaction();//必须先开启事务  
  4.         Book book = realm.createObject(Book.class);  
  5.         book.setAuthor("司马迁");  
  6.         book.setName("史记");  
  7.         realm.commitTransaction();//提交事务  
  8.         book = realm.where(Book.class).findFirst();  
  9.     }  

②查

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. //查询一个数据库中第一个book  
  2.         Book book = realm.where(Book.class)  
  3.                 .equalTo("name","史记")//相当于where name='史记'  
  4.                 .or()//或,连接查询条件;没有这个方法时,默认是隐式地被逻辑和(&)组合  
  5.                 .equalTo("author","司马迁")//相当于 author='司马迁'  
  6.                 .findFirst();  
  7.         //整体相当于select * from (test.realm) where name='史记' or author='司马迁' limit 1;  
  8.         //Book book = realm.where(Book.class).findFirst();  


Realm的查询也是支持排序的,但是它的处理是在查询出结果后再进行排序。

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. RealmResults<Book> result = realm.where(Book.class).findAll();  
  2. //Result.sort(“name”);  
  3. Result.sort(“name”,Sort.DESCENDING);</span>  

注意:目前并不是支持所有字符集


③改

修改之前要确定一件事,你的model中有@PrimaryKey约束的主键,

否则


[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. private void realmUpdate(Realm realm){  
  2.         realm.beginTransaction();//开启事务  
  3.         Book b = new Book();//新建实例  
  4.         b.setId(1);//book类新加的int属性,用@PrimaryKey注解作为主键  
  5.         b.setAuthor("simaqian");  
  6.         b.setName("史记");  
  7.         realm.copyToRealmOrUpdate(b);//修改操作  
  8.         realm.commitTransaction();//提交事务  
  9.     }  

修改还有一种方式,好像还是realm提倡和鼓励的方式,就是直接对查询到的结果修改,然后该修改就会反馈回数据库,例如:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. private void realmUpdate(Realm realm){  
  2.         realm.beginTransaction();  
  3. //        Book b = new Book();  
  4. //        b.setId(1);  
  5. //        b.setAuthor("simaqian");  
  6. //        b.setName("史记");  
  7. //        realm.copyToRealmOrUpdate(b);  
  8.         realm.where(Book.class).findFirst().setAuthor("斯巴达");  
  9.         realm.commitTransaction();  
  10.         realmSelect(realm);  
  11.     }  

感觉还是查询出来复制一份使用比较好。。。

④删

删除和修改一样,你的model中有@PrimaryKey约束的主键

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. private void realmDelete(Realm realm){  
  2.         realm.beginTransaction();  
  3.         RealmResults results = realm.where(Book.class).findAll();  
  4.         //方式一:按下标删除  
  5.         results.remove(1);  
  6.         ////方式二:删除指定model第一种  
  7.         //Book book = new Book();  
  8.         //book.setId(2);  
  9.         //book.setName("史记");  
  10.         //book.setAuthor("司牛迁");  
  11.         //results.remove(book);  
  12.         //方式三:删除指定model第一种  
  13.         //book.removeFromRealm();  
  14.         ////方式四:删除末尾一个  
  15.         //results.removeLast();  
  16.         ////方式wu:清除全部  
  17.         //results.clear();  
  18.         realm.commitTransaction();  
  19.     }  
转载自:http://blog.csdn.net/shareye1992/article/details/50789216

更多学习参考Realm官网
0 0
原创粉丝点击