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

相关文章推荐

观察者模式下载1起始篇

  • 2015年12月04日 00:04
  • 656KB
  • 下载

Revit开发起始篇

  • 2013年02月21日 13:25
  • 169KB
  • 下载

Linux学习笔记之——起始篇

摘要:学习笔记目录、方便以后回顾、没有什么捷径可走、不断的记录、总结、练习、coding、coding。...

ios 3D引擎 SceneKit 开发(1) --起始篇

hello ,大家好,我是Roc.Tian,最近一直在研究苹果自家的3D 引擎 SceneKit ,适当写写博客,总结一下,与大家分享一下,也希望跟大家交流,共同进步。 SceneKit 是一个O...
  • pzhtpf
  • pzhtpf
  • 2015年12月15日 14:09
  • 15736

highcharts图表常见问题:关于如何设置数据点起始位置为坐标原点的问题分析与总结篇(独家爆料)

http://www.stepday.com/topic/?923 从使用highcharts图表开始到如今也见证了很多使用者一直困惑着这样一个问题:如何才能够设置第一个数据点从坐标原点开始?要...

跟Google学习Android开发-起始篇-构建你的第一个应用程序(2)

1.2运行你的应用程序        如果你是按照上一课创建一个Android项目,它包含一些默认设置的“Hello World” 的源文件,现在您可以立即运行这个应用程序。     ...

跟Google学习Android开发-起始篇-构建你的第一个应用程序(3)

1.3构建一个简单的用户界面 Android应用程序的图形用户界面,建立在视图(View)和视图组(ViewGroup)对象的层次结构上。视图对象通常是UI小部件(weidget),如按钮或 文本字...

跟Google学习Android开发-起始篇-构建你的第一个应用程序(4)

1.4启动另一个活动 完成上一课后,你有一个应用程序可以显示带有文本字段和一个按钮的活动(单屏)。在这一课中,您将在MainActivity中添加一些代码,使得用户点击“发送”按钮时能启动一...

跟Google学习Android开发-起始篇-与其它应用程序交互(2)

6.2从活动获取结果 启动另一个活动不必是单向的。您也可以启动另一个活动,并接收一个结果回来。为了接收一个结果,调用startActivityForResult()(而不是startActi...

跟Google学习Android开发-起始篇-管理活动的生命周期(4)

2.4重建活动 在以下几个场景中,由于正常的应用程序的行为,你的活动会被销毁:当用户按下“ 返回“按钮,或您的活动调用finish()方法表示自身的销毁。当活动目前已停止而且在很长一段时间没...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Reaml起始篇
举报原因:
原因补充:

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