Realm技术选型初体验

88 阅读3分钟

}

声明实体

**

  • User Model.

  • 也可以使用@RealmClass注解来生命数据模型,比如:

  • @RealmClass

public class User implements RealmModel {

...

}

  • @author devilwwj

  • @since 2017/6/16

*/

public class User extends RealmObject {

// 主键唯一

@PrimaryKey

private String name;

private int age;

// 属性忽略,意味着此字段可以不被存储到数据库中

@Ignore

private int sessionId;

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 int getSessionId() {

return sessionId;

}

public void setSessionId(int sessionId) {

this.sessionId = sessionId;

}

}

必须继承RealmObject.

写操作

realm.beginTransaction();

User user = realm.createObject(User.class); // 创建一个新的对象

user.setName("John");

user.setEmail("john@corporation.com");

realm.commitTransaction();

不想手动处理事务?使用以下方式:

realm.executeTransaction(new Realm.Transaction() {

@Override

public void execute(Realm realm) {

User user = realm.createObject(User.class);

user.setName("John");

user.setEmail("john@corporation.com");

}

});

想异步处理事务?使用以下方式:

realm.executeTransactionAsync(new Realm.Transaction() {

@Override

public void execute(Realm bgRealm) {

User user = bgRealm.createObject(User.class);

user.setName("John");

user.setEmail("john@corporation.com");

}

}, new Realm.Transaction.OnSuccess() {

@Override

public void onSuccess() {

// 事物成功完成

}

}, new Realm.Transaction.OnError() {

@Override

public void onError(Throwable error) {

// 事物失败,自动取消

}

});

查操作

// 创建一个RealmQuery用于查找所有符合条件的user

RealmQuery query = realm.where(User.class);

// 添加查询条件

query.equalTo("name", "John");

query.or().equalTo("name", "Peter");

// 执行查询

RealmResults result1 = query.findAll();

// 或者进行简化

RealmResults result2 = realm.where(User.class)

.equalTo("name", "John")

.or()

.equalTo("name", "Peter")

.findAll();

改操作

realm.executeTransaction(new Realm.Transaction() {

@Override

public void execute(Realm realm) {

Dog myPuppy = realm.where(Dog.class).equalTo("age", 1).findFirst();

myPuppy.setAge(2);

}

});

删操作

// 获取查询结果

final RealmResults results = realm.where(Dog.class).findAll();

// 所有对数据的变更必须在事物中进行

realm.executeTransaction(new Realm.Transaction() {

@Override

public void execute(Realm realm) {

// 移除符合条件的单个查询结果

results.deleteFirstFromRealm();

results.deleteLastFromRealm();

// 移除单个对象

Dog dog = results.get(5);

dog.deleteFromRealm();

// 移除所有符合条件的查询结果

results.deleteAllFromRealm();

}

});

以上就是Realm的CRUD基本用法,第一次使用确实被惊艳了,很简单易用啊,符合技术选型的一个要求。

除了简单易用,它有没有一些我们不知道的坑,必须有啊,具体看下以下这篇文章:

说说 Realm 在 Android 上的坑

指明了realm有以下缺点:

  • 线程的限制(realm对象只能被创建它的线程中访问,不能随意切换)

  • 数据类型(RealmList没有实现Serializable接口,不能通过intent直接传值)

  • 数据库版本迁移问题(需要关注实体类的变更,这。。)

  • 其实还有增加包大小的问题(可以通过split abi来减少包大小)

总结

--

本篇文章,只是粗略了介绍了Realm的用法,还需要更加深入去使用才能决定是否使用到项目中,在技术选型中,除了简单易用还要考虑是否适合自己的场景,

学习分享

在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了

很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘

如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

2021最新上万页的大厂面试真题

七大模块学习资料:如NDK模块开发、Android框架体系架构...

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。

这份体系学习笔记,适应人群: **第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。 **第二,**开发几年,不知道如何进阶更进一步,比较迷茫。 第三,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果你有需要,我这里恰好有为什么,不来领取!说不定能改变你现在的状态呢! 由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。如有需要获取完整的资料文档的朋友点击我的GitHub免费获取。