正常情况下会在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