关于 RealmJava 的介绍相信官方的文档上介绍的已经非常详细了.谈谈我对 Realm 的使用的认识吧.
为什么要使用 Realm, 最好的解释,速度快呀.有人会知道,继承 Realm 之后 APP 的体积会差不多增加4M, 那么随着 Android 硬件的发展,网络的发展,区区4M 的空间,4M 的流量可以忽略了,哈哈!!
1.根据数据的改变实时更新 UI.我们一般把获取到的数据用 RecycleView 等一些控件展示,一般也就在 adapter 中使用这些数据.我们把数据设置一个 realm 的监听就 OK 了..
2.在我感觉最吊的就是,可以直接存储 json, 当然这是底层帮助我们处理的.
3.更新.就是我们的数据可能只变化了一个,我们可以通过设置PrimaryKey,copyToRealmOrUpdate.下面仔细讲吧.
一. 配置
第一步:在 project 级别的 build.gradle文件中添加依赖
dependencies {
classpath"io.realm:realm-gradle-plugin:2.2.2"
}
第二步:在 App 级别的 build.gradle 文件的开始添加
apply plugin: 'realm-android'
最好写在apply 的最后位置,不知道具体为啥,我之前放在了第一个,编译出错了.很尴尬~~~
二.初始化
在 Application 中配置:
Realm.init(this); //默认的初始化
RealmConfiguration configuration = new RealmConfiguration.Builder().build();
Realm.setDefaultConfiguration(configuration);
注意:这里一定要到配置文件中Application 节点下使用自己的 Application.java
三.建立数据模型
public class User extends RealmObject {
@PrimaryKey
public String name; //PrimaryKey
public String age ;
}
将 name 设置为PrimaryKey,那么这时再往数据库中添内容时,会检查数据库中有没有这个name,
如果有,就会将其原来的数据覆盖;如果没有,就创建一个新的 User. 这里需要注意的是,如果原来存在一个name = tang,age = 18的对象,现在又存一个User, 其中, name = tang,age = null;就是不存在这个 age 的值,那么这时数据库的User 的数据就变化了,把之前有用的 age 替换成了 null, 所以有时需要在此处添加一个非空的判断(可能是服务器返回的 json 太乱).在一切都是规范的前提下是不用如此麻烦的.
四.数据操作
这个 demo 是把数据显示在一个 ListView 上,添加条目,修改条目,删除条目.
package com.example.honglema.myrrdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import com.example.honglema.myrrdemo.module.User;
import java.util.Random;
import io.realm.Realm;
import io.realm.RealmChangeListener;
import io.realm.RealmList;
import io.realm.RealmResults;
public class MainActivity extends AppCompatActivity {
private ListView listView;
private Button change;
private Button add;
private Button delete;
private RealmResults<User> users = Realm.getDefaultInstance().where(User.class).findAll();
private MyAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.list);
change = (Button) findViewById(R.id.change);
add = (Button) findViewById(R.id.add);
delete = (Button) findViewById(R.id.delete);
myAdapter = new MyAdapter();
listView.setAdapter(myAdapter);
//设置数据改变的监听
users.addChangeListener(new RealmChangeListener<RealmResults<User>>() {
@Override
public void onChange(RealmResults<User> element) {
//将改变的之后的数据集合重新设置到 adapter 中
myAdapter.setItems(element);
}
});
//添加数据
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Realm.getDefaultInstance().executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
User user = new User();
user.name = "Person"+new Random().nextInt(100);//后面加一个随机的值,但是还有可能存在哦~~
user.age = 20;
realm.copyToRealm(user);// 添加到数据库中
}
});
}
});
//改变内容
change.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Realm.getDefaultInstance().executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
User user = realm.where(User.class).findFirst();
if (user == null) {
return;
}
user.age += new Random().nextInt(10);
//realm.copyToRealmOrUpdate(mUser);//在事物中,存在 Key 值,已经在存储数
}
});
}
});
//删除
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Realm.getDefaultInstance().executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
if (users.size() <= 0) {
return;
}
users.deleteFromRealm(0); //
}
});
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
users.removeChangeListeners();// 移除数据监听
}
class MyAdapter extends BaseAdapter {
RealmResults<User> items;
public void setItems(RealmResults<User> items) {
this.items = items;
notifyDataSetChanged();
}
@Override
public int getCount() {
if (items == null) {
return 0;
}
return items.size();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView textView = new TextView(getApplicationContext());
textView.setTextSize(22);
textView.setTextColor(getResources().getColor(R.color.colorAccent));
final User user = (User) getItem(position);
textView.setText("name:" + user.name + ", age:" + user.age);
//点击条目,改变条目的内容
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Realm.getDefaultInstance().executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
int age = 10 ;
if(age == 10) {
user.age += 2;
}
}
});
}
});
return textView;
}
@Override
public Object getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
}
}
这只是初学的用法,还有许多知识没有讲到,慢慢学习总结吧,希望能帮助到大家!!!!
下一篇讲讲,和 RxJava 一起使用的简单用法~~~
哈!!