Reaml起始篇

原创 2016年06月01日 20:35:44
手机客户端开源数据库现在越来越多,但是从效率上讲,Realm数据库开源框架比起大家熟知的Ormlite和GreenDao而言有很大提升,使用方便集成快,而且支持异步数据查询操作和数据更新操作,首先说下集成环境搭配:
第一是将配制项目的gradle,工作空间的gradle配置如下:
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0'
        classpath "io.realm:realm-gradle-plugin:1.0.0"
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
Module的gradle配置如下:
apply plugin: 'com.android.application'
apply plugin: 'realm-android'
可能会build时候可能会出现gradle—wrapper版本问题:
说什么版本请更新到2.10的gradle,这里有解决方案:http://www.ithao123.cn/content-10783272.html
这样就搭建好的Realm开发环境:
 数据库首先需要一个bean对象,我们创建了一个User对象继承了RealmObject
public class User extends RealmObject {
    private  String name;

    private  int age;

    @Ignore
    private int sex;

    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 getSex() {
        return sex;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                '}';
    }
}
记住@Ignore会忽视对象作用于sex,当我们更新数据想修改sex时候会无法成功,并且创建的时候去改变这个值也是无法修改的,只会是默认值0;之后我们会测试下:
好了创建了一个对象表,那么自然而然想往表里面添加一些数据,但是我们首先要获取一个realm对象,然后执行插入数据操作:
RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(MainActivity.this).build();
Realm.setDefaultConfiguration(realmConfiguration); 
Realm realm = Realm.getDefaultInstance();
上面代码会获取一个默认的realm对象,如果不使用默认的realm对象可以这样创建:
Realm myOtherRealm =
        Realm.getInstance(
                new RealmConfiguration.Builder(context)
                        .name("myOtherRealm.realm")
                        .build()
);
创建完了这个对象就可以执行相应数据操作:
realm.beginTransaction();
User user = realm.createObject(User.class);
user.setAge(12);
user.setName("JACK");
User user2 = realm.createObject(User.class);
user2.setAge(14);
user2.setName("JACK2");
realm.commitTransaction();
如上插入两个对象,记住这样的写法会需要手动开启事务和关闭事务,或许感觉会有点麻烦。
我们可以这样:
realm.executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(Realm bgrealm) {
        User user = bgrealm.createObject(User.class);
        user.setAge(12);
        user.setName("JACK");
        user.setSex(1);
        User user2 = bgrealm.createObject(User.class);
        user2.setAge(14);
        user2.setName("JACK2");
        user2.setSex(1);
    }
});
执行一个事务,并且使用的是bgrealm,这样就可以实现类似于异步操作数据库了。
当然realm提供异步操作数据库的方法:
realm.executeTransactionAsync(new Realm.Transaction() {
    @Override
    public void execute(Realm bgrealm) {
        User user = bgrealm.createObject(User.class);
        user.setAge(12);
        user.setName("JACK");
        user.setSex(1);
        User user2 = bgrealm.createObject(User.class);
        user2.setAge(14);
        user2.setName("JACK2");
        user2.setSex(1);
    }
});
就是真正上的异步操作数据库。
说道查询可能是大家都觉得一定很难吧,其实Realm已经将查询工作做到很简单了,如下最基本的查询:
RealmResults<User> findallrealmResults = realm.where(User.class).findAll();
这样就查询了User表中所有数据。
条件查询也很简单:
RealmResults<User> realmResults = realm.where(User.class).equalTo("name", "JACK").equalTo("age", 12).findAll();
reaml支持lessThan,equalTo,lessThanOrEqualTo,greaterThan等等方法;有多少个条件就在后面一个个加上去就行了。
除了查询之外我们还可以监听我们之前查询的数据量变化,当添加了数据之后我们是不是需要执行一个新的查询??Realm早就帮我们想好了,它提供了如下方法:
findallrealmResults.addChangeListener(new RealmChangeListener<RealmResults<User>>() {
    @Override
    public void onChange(RealmResults<User> element) {
        Log.i(TAG, "onChange: " + element.size());
    }
});
当执行数据插入时候会监听捕捉到数据变化,于是我们就不需要在执行一次数据查询。
数据更新操作起始也很简单,只需要执行一个异步的方法realm.executeTransactionAsync,在这个方法里面先查询需要更改的数据,然后在执行new Realm.Transaction.OnSuccess()方法就可以了,如下:
realm.executeTransactionAsync(new Realm.Transaction() {
    @Override
    public void execute(Realm bgRealm) {
        RealmResults<User> findresults = bgRealm.where(User.class).equalTo("age", 13).findAll();
        for (User u : findresults
                ) {
            u.setAge(13);
            u.setSex(1);//此处不生效,因为sex属性是Ingroce
        }
    }
}, new Realm.Transaction.OnSuccess() {
    @Override
    public void onSuccess() {
        for (User u : findallrealmResults
                ) {
            Log.i(TAG, "user:" + u.toString());
        }
    }
}, new Realm.Transaction.OnError() {
    @Override
    public void onError(Throwable error) {

    }
});
最后还有一个删除操作也很简单,还是先查询然后在执行删除操作,如下:
btnDelete.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        realm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm bgrealm) {
                RealmResults<User> results = realm.where(User.class).findAll();
                User user=results.get(2);
                user.deleteFromRealm();//删除指定位置的查询结果

                results.deleteLastFromRealm();//删除最后一个查询结果
                results.deleteAllFromRealm();//删除所有的查询到的结果
                results.deleteFirstFromRealm();//删除第一个查询结果
            }
        });
    }
});
Demo下载地址:https://github.com/1036711153/RealmDemo
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

在android中使用Realm数据库框架

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

Android Realm数据库完美解析

当我们的app有数据需要保存到本地缓存时,可以使用file,sharedpreferences,还有sqlite。 sharedpreferences其实使用xml的方式,以键值对形式存储基本数据类型...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

Reaml起始篇

手机客户端开源数据库现在越来越多,但是从效率上讲,Realm数据库开源框架比起大家熟知的Ormlite和GreenDao而言有很大提升,使用方便集成快,而且支持异步数据查询操作和数据更新操作,首先说下...

node.js接触篇之-下载安装

一直热衷前后端一波流开发,最近工作核心放到前端,传说node.js如何之高大上,具体高大之处咱日后慢慢深究,直接部署上手来个helloword先。 (1)首先下载node.js,都说去官网下载,这里...

C++之起航篇

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...

Python基础-起始篇

1、Python程序Hello World 1.1 在Linux终端编写第一个程序: 1.2 在vi中创建hello.py 并运行: 1.3 在ipython中编写程序: 1.4 在pycharm中编...

try Redis -- redis 起始篇

用了一段时间memcached,感觉真的挺不错。基于内存的 key-v

OpenStack源码系列---起始篇

近一年来我负责公司云点的自动化部署工作,包括公司自有云平台方案、XenServer、vSphere、Ovirt和OpenStack的自动化安装部署,目前已经到了OpenStack这一部分。自动化部署首...

负载均衡之起始篇

负载平衡简介    或许有些读者仍然对负载平衡这个名词感到陌生,那么我们就花一小段篇幅来讲解一下到底什么是负载平衡。    在一个大型网站中,在线用户有时可能有几千个甚至上万个之多。如果一个用...

angularjs2 简单使用起始篇(一)

本篇文章基于angularjs 2.3.0 angularjs2 是不同于anjularjs ,前者是基于组件的,而后者着是基于demo的。angularjs2 比较像RN。组件化是前端的一个趋势,这...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)