在android中使用Realm数据库框架

详细参考说明在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中初始化

<span style="font-size:14px;">public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(this).build();
        Realm.setDefaultConfiguration(realmConfiguration);
    }
}</span>

2.在activity或者fragment中获取和关闭realm

<span style="font-size:14px;">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();
    }
}</span>

<span style="font-size:14px;">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();
    }
}</span>

3.使用realm来操作数据库,尽管这些操作很快,但是还是建议放在后台进行。可以在回调中更新ui

<span style="font-size:14px;">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.
            }
        });</span>

这里要注意,你监听了并且在回调的方法中执行了ui操作。可能你执行ui操作之前activity或者fragment已经关闭

,所以我们要及时关闭realm任务,避免程序crash
<span style="font-size:14px;">@Override
public void onStop () {
    if (transaction != null && !transaction.isCancelled()) {
        transaction.cancel();
    }
}</span>

4.加密数据库

<span style="font-size:14px;">	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);</span>

5.一些基本的常用的realm数据库操作。

支持boolean, byte, short, ìnt, long, float, double, String, Date and byte[];
其中byte, short, int, and long会自动映射成long
a,建立实体对象,继承RealmObject
RealmObject是自动更新的,比如你将一个数据读取出来后,又做了修改,修改会马上在数据中生效,不需要你再
将数据保存到数据库
<span style="font-size:14px;">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; }
}</span>
当然也支持绑定一个reamlobject,来建立数据库中一对一,一对多,多对多的关系
比如一对一:
<span style="font-size:14px;">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
}</span>
比如一对多,多对多,使用RealmList
<span style="font-size:14px;">public class Contact extends RealmObject {
    public String name;
    public RealmList<Email> emails;
}

public class Email extends RealmObject {
    public String address;
    public boolean active;
}</span>
b.根据上面的介绍,建立好实体对象和完成reaml的初始化和获取后。就可以开始幸福的简单的数据库操作了
包含增删改查;
下面的操作都要放到executeTransactionAsync中
1.增加记录,
<span style="font-size:14px;">User user = realm.createObject(User.class);
user.setName("John");
user.setEmail("john@corporation.com");</span>
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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值