详细参考说明在https://realm.io/docs/java/latest/#getting-started
Github地址在https://github.com/realm/realm-java


具体要使用该框架需要参考文档Getting Started中配置
Realm使用C++编写,不同于android中的sqlite

下面看一张结构图,


realm重要的对象,
Realm,RealmConfiguration,RealmObject,RealmList,RealmQuery,RealmResults这些概念想要了解可以去看文档。


1.在application中初始化
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(this).build();
Realm.setDefaultConfiguration(realmConfiguration);
}
}


2.在activity或者fragment中获取和关闭realm
public class MyActivity extends Activity {
private Realm realm;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
realm = Realm.getDefaultInstance();
}


@Override
protected void onDestroy() {
super.onDestroy();
realm.close();
}
}
//////////
public class MyFragment extends Fragment {
private Realm realm;


@Override
public void onStart() {
super.onStart();
realm = Realm.getDefaultInstance();
}


@Override
public void onStop() {
super.onStop();
realm.close();
}
}


3.使用realm来操作数据库,尽管这些操作很快,但是还是建议放在后台进行。可以在回调中更新ui
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() {
// Transaction was a success.
}
}, new Realm.Transaction.OnError() {
@Override
public void onError(Throwable error) {
// Transaction failed and was automatically canceled.
}
});
这里要注意,如何你监听了并且在回调的方法中执行了ui操作。可能你执行ui操作之前activity或者fragment已经关闭
,所以我们要及时关闭realm任务,避免程序crash
@Override
public void onStop () {
if (transaction != null && !transaction.isCancelled()) {
transaction.cancel();
}
}


4.加密数据库,
byte[] key = new byte[64];
new SecureRandom().nextBytes(key);
RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(this)
.encryptionKey(key)
.build();
// Start with a clean slate every time
Realm.deleteRealm(realmConfiguration);
// Open the Realm with encryption enabled
realm = Realm.getInstance(realmConfiguration);


5.一些基本的常用的realm数据库操作。
支持boolean, byte, short, ìnt, long, float, double, String, Date and byte[];
其中byte, short, int, and long会自动映射成long
a,建立实体对象,继承RealmObject
RealmObject是自动更新的,比如你将一个数据读取出来后,又做了修改,修改会马上在数据中生效,不需要你再
将数据保存到数据库
public class User extends RealmObject {


realm不支持final, transient and volatile 修饰符


@PrimaryKey 定义主键
private int id;


@Required 表示realm会检查该字段不允许为空
private String name;
private int age;

@Ignore 表示realm会在操作数据库时忽略该字段,不会存放
private int sessionId;
// Standard getters & setters generated by your IDE…
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; }
}
当然也支持绑定一个reamlobject,来建立数据库中一对一,一对多,多对多的关系


比如一对一:
public class Email extends RealmObject {
private String address;
private boolean active;
// ... setters and getters left out
}


public class Contact extends RealmObject {
private String name;
private Email email;
// ... setters and getters left out
}


比如一对多,多对多,使用RealmList
public class Contact extends RealmObject {
public String name;
public RealmList<Email> emails;
}


public class Email extends RealmObject {
public String address;
public boolean active;
}


b.根据上面的介绍,建立好实体对象和完成reaml的初始化和获取后。就可以开始幸福的简单的数据库操作了
包含增删改查;
下面的操作都要放到executeTransactionAsync中
1.增加记录,
User user = realm.createObject(User.class);
user.setName("John");
user.setEmail("john@corporation.com");


2.查询记录,
RealmResults<User> result2 = realm.where(User.class) //以where表示条件的开头
中间表示条件
.equalTo("name", "John")
.or()
.equalTo("name", "Peter")

.findAll(); //以findAll表示条件的结尾
可以不要条件,表示全部查找。也可以将多个连续查询合并,示例如下
RealmResults<User> r2 = realm.where(User.class)
.equalTo("dogs.name", "Fluffy")
.findAll()

.where()
.equalTo("dogs.color", "Brown")
.findAll();

.where()
.equalTo("dogs.color", "Yellow")
.findAll();
一些常用的查找条件,
between(), greaterThan(), lessThan(), greaterThanOrEqualTo() & lessThanOrEqualTo()
equalTo() & notEqualTo()
contains(), beginsWith() & endsWith()
isNull() & isNotNull()
isEmpty() & isNotEmpty()
可以查完后排序
RealmResults<User> result = realm.where(User.class).findAll();
result = result.sort("age"); // Sort ascending
result = result.sort("age", Sort.DESCENDING);
可以查完后进行求和,求最大最小,求平均
RealmResults<User> results = realm.where(User.class).findAll();
long sum = results.sum("age").longValue();
long min = results.min("age").longValue();
long max = results.max("age").longValue();
double average = results.average("age");

long matches = results.size();

3.删除记录,搜索出需要删除的记录后调用
final RealmResults<User> results = getUsers();
results.deleteFromRealm(0);

results.deleteFirstFromRealm();
results.deleteLastFromRealm();

results.deleteAllFromRealm();

4.修改记录,直接查完后调用set方法就可以了。

更多相关文章

  1. Android函数响应式编程——必学的RxJava组合操作符startWith、me
  2. delphixe 安卓 android操作 打电话,摄像头,定位等
  3. [转载]Android(安卓)ContentProvider和Uri详解 (绝对全面)
  4. Android中对/data/data//files下文件的读写操作
  5. Android(安卓)RecyclerView多布局的实现
  6. Android中使用系统提供API数据访问接口操作数据库
  7. 《Android(安卓)JNI》04 对java传进来的数组进行操作并返回
  8. android cursor和cursoradapter的监听机制
  9. Android(安卓)AsyncTask 的实现及 cancel 方式

随机推荐

  1. 怎样更新Android(安卓)SDK1.1 到 Android
  2. Android(安卓)HTTP框架Volley详解
  3. android studio3 多渠道打包及编译速度优
  4. Android(安卓)basic1
  5. Android平板获取唯一标识DeviceId
  6. Android(安卓)basic1
  7. Android(安卓)自带图标库 android.R.draw
  8. rock960 android box compiling!
  9. android对话框的使用
  10. Android(安卓)自带图标库 android.R.draw