Realm进阶篇

来源:互联网 发布:电脑分区数据恢复 编辑:程序博客网 时间:2024/05/16 14:53
正常情况下会在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
0 0
原创粉丝点击