Realm进阶篇

正常情况下会在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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值