您的位置:首页 > 移动开发 > Android开发

在android中使用Realm数据库

2016-06-08 15:59 453 查看
详细参考说明在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方法就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: