Android Realm数据库的查询及自动更新
来源:互联网 发布:羽泉的唱功 知乎 编辑:程序博客网 时间:2024/05/22 11:47
上一篇文章Android Realm数据库的使用写了Relam数据库的基本配置和基本用法,这次主要看看Realm数据库的查询以及自动更新。
1.查询
查询分为同步和异步,同步和异步的使用请看上一篇文章,这次主要是学习查询条件的使用:
//查找年龄在10~50岁的Student,并且结果按降序排列 RealmResults<Student> list = mRealm.where(Student.class) .between("age", 10, 50) .findAllSorted("age", Sort.DESCENDING); //查找年龄大于等于70或者名字叫"斯巴达1"的所有Student,结果按升序排列 RealmResults<Student> list = mRealm.where(Student.class) .beginGroup() .greaterThanOrEqualTo("age", 70) .or() .equalTo("name", "斯巴达1") .endGroup() .findAllSorted("age", Sort.ASCENDING);//查找班级是1并且年龄是20的StudentRealmResults<Student> list = mRealm.where(Student.class) .equalTo("clazz", 1) .findAll() .where() .equalTo("age", 20) .findAll();
基本语法和GreenDao差不多,用过类似ORM的应该都很容易上手。
2.自动更新
如果Realm的实例存在于带有Looper,也就是UI线程,那么这个Realm就拥有自动更新的功能。也就是说如果Realm数据库发生了变化,那么数据库就会在下一个事件循环中自动更新,这样也就实现了数据与UI的同步。
如果你在子线程中添加数据到Realm数据库,你可以添加一个onChangeListener来监听数据的变化,这样在数据发生变化的时候就会执行相应的操作。
public class MyActivity extends Activity { private Realm realm; private RealmChangeListener realmListener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); realm = Realm.getDefaultInstance(); realmListener = new RealmChangeListener() { @Override public void onChange(Realm realm) { // ... do something with the updates (UI, etc.) ... }}; realm.addChangeListener(realmListener); } @Override protected void onDestroy() { super.onDestroy(); // Remove the listener. realm.removeChangeListener(realmListener); //or use realm.removeAllChangeListeners() if needed. // Close the Realm instance. realm.close(); }}
这些变化的监听也可以添加在RealmObject或者RealmResults的实例中,你可以通过这样的方式来监视对象和查询结果的改变。另外,当监听回调函数被调用时,相应的数据已经被更新,不需要去做刷新操作。
public class MyActivity extends Activity { private Realm realm; private RealmChangeListener puppiesListener; private RealmChangeListener dogListener; private RealmResults<Dog> puppies; private Dog dog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); realm = Realm.getDefaultInstance(); puppiesListener = new RealmChangeListener() { @Override public void onChange(RealmResults<Dog> puppies) { // ... do something with the updated puppies instance }}; // Find all the puppies puppies = realm.where(Dog.class).lessThanOrEqualTo("age", 2).findAll(); puppies.addChangeListener(puppiesListener); dogListener = new RealmChangeListener() { @Override public void onChange(Dog dog) { // ... do something with the updated Dog instance }}; dog = realm.where(Dog.class).equalTo("name", "Fido").findFirst(); dog.addChangeListener(dogListener); } @Override protected void onDestroy() { super.onDestroy(); // Remove the listeners puppies.removeChangeListener(puppiesListener); dog.removeChangeListener(dogListener); // Close the Realm instance. realm.close(); }}
如果Realm实例存在与非UI线程,那么数据不会发生自动刷新,知道手动调用waitForChange()方法。如果您想确定当前 Realm 实例是否有自动更新功能,可以通过调用 isAutoRefresh() 方法查询。官方是这样说的:
Change listeners only work on Looper threads. For non-looper threads, you manually have to use Realm.waitForChange() instead.也就是说对Realm数据变化的监听只会在主线程执行,要想在非UI线程使用,需要使用waitForChange()代替。
另外,官方还重写了ListView和RecyclerView的Adapter,可以实现数据的实时刷新。用法大同小异,需要在module一级的build.gradle中添加依赖:
compile 'io.realm:android-adapters:1.4.0'
具体用法以RecyclerView为例:
public class DetailActivity extends AppCompatActivity { public static final String STUDENT = "STUDENT"; private Realm mRealm; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_detail); getSupportActionBar().setTitle("RealmAdapter"); mRealm = Realm.getDefaultInstance(); RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.mRecyclerView); mRecyclerView.setHasFixedSize(true); mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); //Realm的查询方法 //查找年龄在10~50岁的Student,并且结果按降序排列 RealmResults<Student> list = mRealm.where(Student.class) .between("age", 10, 50) .findAllSorted("age", Sort.DESCENDING); mRecyclerView.setAdapter(new MyAdapter(this, list, true));//这里就设置了自动更新 } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.insert) { mRealm.beginTransaction(); List<Student> list = new ArrayList<>(); for (int i = 0; i < 100; i++) { Student s = new Student(UUID.randomUUID().toString(), "斯巴达" + i, i, (i % 2) + 1); list.add(s); } mRealm.copyToRealm(list); mRealm.commitTransaction(); } return super.onOptionsItemSelected(item); } class MyAdapter extends RealmRecyclerViewAdapter<Student, MyAdapter.ViewHolder> { public MyAdapter(@NonNull Context context, @Nullable OrderedRealmCollection<Student> data, boolean autoUpdate) { super(context, data, autoUpdate); } class ViewHolder extends RecyclerView.ViewHolder { private TextView name; private TextView clazz; public ViewHolder(View itemView) { super(itemView); name = (TextView) itemView.findViewById(R.id.name); clazz = (TextView) itemView.findViewById(R.id.clazz); } } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false); return new ViewHolder(itemView); } @Override public void onBindViewHolder(ViewHolder holder, int position) { Student student = getData().get(position); holder.name.setText(student.getName()); holder.clazz.setText(String.format(Locale.CHINA, "%d班", student.getClazz())); } } @Override protected void onDestroy() { super.onDestroy(); if (mRealm != null && !mRealm.isClosed()) { mRealm.close(); mRealm = null; } }}
想了解更详细的内容可以看官方介绍。
1 0
- Android Realm数据库的查询及自动更新
- 关于Android数据库—realm的使用及理解
- Android数据库Realm的第一次
- Android Realm数据库的使用
- Realm 数据库的使用(iOS &Android)
- realm数据库 For android
- Android数据库Realm实践
- Android数据库Realm实践
- Android Realm数据库使用指南
- Android Realm数据库使用指南
- Android Realm数据库使用指南
- Android Realm数据库使用指南
- android数据库 Realm
- Android Realm数据库使用
- 数据库Realm的使用
- Realm数据库-目前最流行的android数据库
- 【Android】Realm详解(Android 数据库Sqlite的完美替代者)
- Realm之一步上位(基于本地Realm数据库的Android图书馆管理系统)
- 我的框架--QiCai(模型类 PDO连接数据库)
- centos6.5文件共享,nfs服务,mount连接
- C# 父窗体中点击多个子窗体不出现重复
- oralce数据库索引
- c3p0 报 APPARENT DEADLOCK!!!
- Android Realm数据库的查询及自动更新
- 解决上传到github报错Successfully created project 'Demo' on GitHub, but initial commit failed:
- Ajax语法浅析
- java API中文版本
- Linux学习资料
- Redis 使用介绍
- noip普及组2004 花生采摘
- 浅谈管道模型(Pipeline)
- 学习运维——简单操作命令及系统知识