Realm进阶篇

原创 2016年06月01日 20:36:54
正常情况下会在Application中创建RealmConfiguration,然后在Activity或者其他地方调用 Realm.getDefaultInstance();即可,如下:
public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(this).name("myrealm.realm")
                .build();
        Realm.setDefaultConfiguration(realmConfiguration);
    }
}

那么在Activity中获取则变得如下realm=Realm.getDefaultInstance();就可以获取realm实例。
realmResults = realm.where(User.class).findAll();
adapter=new Adapter(realmResults, SecondActivity.this);
mlistview.setAdapter(adapter);
realmResults.addChangeListener(new RealmChangeListener<RealmResults<User>>() {
    @Override
    public void onChange(RealmResults<User> element) {
        adapter.notifyDataSetChanged();
    }
});
获取一个realmResults集合对象,然后将其显示在listView中,Adpter代码如下:
package com.customview.learnrealm;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.customview.learnrealm.bean.User;

import io.realm.RealmResults;

/**
 * Created by admin on 2016/6/1.
 */
public class Adapter extends BaseAdapter{
    private RealmResults<User> users;
    private Context context;

    public Adapter(RealmResults<User> users, Context context) {
        this.users = users;
        this.context = context;
    }

    @Override
    public int getCount() {
        return users.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view= LayoutInflater.from(context).inflate(R.layout.second_item,null);
        TextView tv_name= (TextView) view.findViewById(R.id.tv_name);
        TextView tv_age= (TextView) view.findViewById(R.id.tv_age);
        TextView tv_dogs= (TextView) view.findViewById(R.id.dogs);
        tv_name.setText(users.get(position).getName());
        tv_age.setText(users.get(position).getAge()+"");
        tv_dogs.setText(users.get(position).getDogs().toString());
        return view;
    }
}
获取到的realmResults对象可以设置监听器,当有数据变化时候就更新adapter,即调用adapter.notifyDataSetChanged();
为了方便测试使用一个按钮,点击就会添加2个对象到realmResults集合中
 btnAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                realm.executeTransaction(new Realm.Transaction() {
                    @Override
                    public void execute(Realm bgrealm) {
                        User user = bgrealm.createObject(User.class);
                        user.setAge(16);
                        user.setName("ZHANGSAN");
                        Dog dog1= bgrealm.createObject(Dog.class);
                        Dog dog2= bgrealm.createObject(Dog.class);
                        dog1.setName("DOG1");
                        dog2.setName("DOG2");
                        RealmList<Dog> dogs=new RealmList<Dog>();
                        dogs.add(dog1);
                        dogs.add(dog2);
                        user.setDogs(dogs);
                        user.setSex(1);
                        User user2 = bgrealm.createObject(User.class);
//                        Dog dog3= bgrealm.createObject(Dog.class);
//                        dog3.setName("DOG3");
//                        user2.dogs.add(dog3);
                        user2.setAge(19);
                        user2.setName("LISI");
                        user2.setSex(1);
                    }
                });
            }
        });
最后不要忘记销毁Activity中加上realm关闭和移除监听。
@Override
protected void onDestroy() {
    super.onDestroy();
    realm.removeAllChangeListeners();
    realm.close();
}
简单的realm实例就完成了,但是当我们修改对象属性的时候再次运行会报:io.realm.exceptions.RealmMigrationNeededException
等莫名其妙的错误,查看错误日志你就会发现当对象添加或者删除一个属性时候,那么之前的版本就会无法在运行了,以前的那些开源数据库怎么做的呢?升级版本号,对就是升级版本号,但是Realm其实还有很简单的方法就是:
public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(this).name("myrealm.realm")
                .deleteRealmIfMigrationNeeded()
                .build();
        Realm.setDefaultConfiguration(realmConfiguration);
    }
}
在Application配置中加上deleteRealmIfMigrationNeeded()意思是当新版本出现我们可以删除之前版本直接创建了新版本。代价就是之前版本的数据不存在了。

Demo下载地址:https://github.com/1036711153/RealmDemo

Realm使用小记

最近有点空闲时间,就记录一下以前忘记记录的内容。 Realm是一个能够代替SQLite和Core Data的手机数据库。使用 C++ 内核,所以效率非常的高,是 sqlite 的近几倍。 其实我们...

说说Realm在Android上的坑

1.前言新项目使用了大名鼎鼎的realm,在网络上看到大量安利realm的文章,但是在使用的过程中却遇到了很多问题,这里记录下两个多月以来遇见的问题。希望大家能够理性选择,不要人云亦云。当然,,rea...

iOS中 Realm的学习与使用 韩俊强的博客

每日更新关注:http://weibo.com/hanjunqiang 新浪微博! iOS开发者交流QQ群:446310206 有问题或技术交流可以咨询!欢迎加入! 这篇直接搬了一份官方文档过来看...

【android进阶篇】MVP+Retrofit+RxJava框架结合

【android进阶篇】【android进阶篇】MVP+Retrofit+RxJava框架结合 另一篇MVP优化,[android进阶篇]MVP模式优化,防止内存泄漏和空指针问题 一、前言MVP模...

观察者模式下载2进阶篇

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

Chrome开发者工具不完全指南(四、性能进阶篇)

前言   Profiles面板功能的作用主要是监控网页中各种方法执行时间和内存的变化,简单来说它就是Timeline的数字化版本。它的功能选项卡不是很多(只有三个),操作起来比较前面的几块功能版...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Realm进阶篇
举报原因:
原因补充:

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