Reaml起始篇

手机客户端开源数据库现在越来越多,但是从效率上讲,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
阅读更多
文章标签: Realm Android数据库
个人分类: Android数据库 android
上一篇Android网络图片实现图片轮播
下一篇Realm进阶篇
想对作者说点什么? 我来说一句

Revit开发起始

2013年02月21日 169KB 下载

没有更多推荐了,返回首页

关闭
关闭