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
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Reaml起始篇

手机客户端开源数据库现在越来越多,但是从效率上讲,Realm数据库开源框架比起大家熟知的Ormlite和GreenDao而言有很大提升,使用方便集成快,而且支持异步数据查询操作和数据更新操作,首先说下...

Realm数据库

Realm是一个移动端用来替代sqlite数据库的解决方案,支持android、ios,支持加密。基础api和示例可以参考官网,以下纪录的是在使用移动数据库时需要考虑的问题。

Realm使用小记

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

Realm实战总结---Android

数据库一直以来给我的感觉就是——麻烦!!! 接触了Realm之后才终于可以开开心心的使用数据库了。 本文总结一些Realm数据库的常用知识点,包括多线程访问,以及如何与Retrofit2.0一起使用等...
  • javine
  • javine
  • 2016-03-30 16:50
  • 8856

Realm 使用教程

Realm Java 原文 官网 https://realm.io/cn/docs/java/latest/0.90.1 Realm Java 让你能够高效地编写 app 的模型层代码,保证你的...

SNMP从入门到开发:进阶篇

管理信息库:MIB 我们要扩展mib首先必须清楚mib是如何定义的,用的什么语言,有哪些约定,遵循哪些规则等等。这些基本东西掌握过后,我们就可以很轻松的来写自己的mib文件了。 所谓管理信息库,或...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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