MatrixCursor:可以实例化的Cursor以及其应用场景

泡在网上的日子 / 文 发表于2014-10-24 17:59 次阅读 sqlite

如果想得到一个Cursor, 而此时又没有数据库返回一个Cursor,此时可以通过MatrixCursor来返回一个伪造的Cursor。比如一个程序在一般情况下用getContentReslover.query从数据库查询数据,但是在很特殊的某条件下,需要返回的只是几条固定的已知记录,不需要从数据库查询,但是为了最终结果能被调用他的方法使用,我们还是希望返回的是Cursor,那么就需要MatrixCursor根据这些已知的记录来构造一个Cursor

也许这里有一个疑问:为什么Cursor自己不能构造一些数据呢?

因为Cursor只是一个interface,不是一个具体的类,getContentReslover.query返回的其实也不是Cursor而是Cursor的一种实现。


MatrixCursor具体使用方法如下:

假如有一个如下的数据库表结构
_id
name
price
R.drawable.ic_launcher
row139
R.drawable.ic_launcher
row240
R.drawable.ic_launcher
row341
R.drawable.ic_launcher
row4
42

现在咱们就通过MatrixCursor这个东西,来虚构出一张上面那样的表结构,下面通过一个例子,就可以完全理解MatrixCursor这个东西啦!!
package com.test.matrixcursor;
import android.app.ListActivity;
import android.database.MatrixCursor;
import android.os.Bundle;
import android.support.v4.widget.SimpleCursorAdapter;
import android.view.View;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends ListActivity {
     private static final String[] COLUMN_NAME = { "_id", "name", "price" };
     private MatrixCursor matrixCursor;
     @Override
     protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
           createList();
           //createList2();
     }
     private void createList() {
          matrixCursor = new MatrixCursor(COLUMN_NAME, 1);
          matrixCursor.addRow(new Object[] { R.drawable.ic_launcher, "row1",
                    39 });
          matrixCursor
                    .addRow(new Object[] { R.drawable.ic_launcher, "row2", 40 });
          matrixCursor
                    .addRow(new Object[] { R.drawable.ic_launcher, "row3", 41 });
          matrixCursor.addRow(new Object[] { R.drawable.ic_launcher, "row4",
                    42 });
          matrixCursor
                    .addRow(new Object[] { R.drawable.ic_launcher, "row5", 43 });
          setListAdapter(new SimpleCursorAdapter(this, R.layout.activity_main,
                    matrixCursor, COLUMN_NAME, new int[] { R.id.icon, R.id.name,
                              R.id.price }));
     }
     //第二种添加row的方式
     private void createList2() {
          matrixCursor = new MatrixCursor(COLUMN_NAME, 1);
          MatrixCursor.RowBuilder builder1 = matrixCursor.newRow();
          builder1.add(R.drawable.ic_launcher);
          builder1.add("row1");
          builder1.add(39);
          MatrixCursor.RowBuilder builder2 = matrixCursor.newRow();
          builder2.add(R.drawable.ic_launcher);
          builder2.add("row2");
          builder2.add(40);
          MatrixCursor.RowBuilder builder3 = matrixCursor.newRow();
          builder3.add(R.drawable.ic_launcher);
          builder3.add("row3");
          builder3.add(41);
          setListAdapter(new SimpleCursorAdapter(this, R.layout.activity_main,
                    matrixCursor, COLUMN_NAME, new int[] { R.id.icon, R.id.name,
                              R.id.price }));
     }
     @Override
     protected void onListItemClick(ListView l, View v, int position, long id) {
          super.onListItemClick(l, v, position, id);
          matrixCursor.moveToPosition(position);
          StringBuilder builder = new StringBuilder();
          builder.append("Name:")
                    .append(matrixCursor.getString(matrixCursor
                              .getColumnIndex("name"))).append("\n");
          builder.append("Price:")
                    .append(matrixCursor.getString(matrixCursor
                              .getColumnIndex("price"))).append("\n");
          Toast.makeText(getApplicationContext(), builder.toString(), 1000)
                    .show();
     }
}
实现步骤仅需3步,下面通过字符数组来说明:
步骤1.首先创建一个字符数组,且字符数组的值对应着表的字段,如下:
     String[] COLUMN_NAME = { "_id", "name", "price" };
步骤2.利用MatrixCursor的构造方法,构造一个MatrixCursor,传入的参数即是步骤1中创建的字段数组,如下:
MatrixCursor  matrixCursor=new  MatrixCursor(COLUMN_NAME);
也可以指定初始大小,如:
matrixCursor = new  MatrixCursor(COLUMN_NAME, 10);
步骤3. 通过matrixCursor 的addRow方法添加一行值,相当于向数据库中插入一条记录,如下:
matrixCursor.addRow(new Object[] { R.drawable.ic_launcher, "zhangsan",39 });

注:步骤3也可以通过构造一个MatrixCursor.RowBuilder来实现,也是相当于向数据库中插入一条记录,如下:
MatrixCursor.RowBuilder builder1 = matrixCursor.newRow();
builder1.add(R.drawable.ic_launcher);
builder1.add("zhangsan");
builder1.add(39);
通过上面三步即可完成MatrixCursor 的构造。从MatrixCursor 中取出数据的过程与Cursor相同,不再赘述!


收藏 赞 (1) 踩 (1)
上一篇:使用Event Bus模式解耦Android App组件间通信
转自 云在千峰 的博客,本站编辑整理。 场景描述 当一个Android应用功能越来越多的时候,保证应用的各个部分之间高效的通信将变得越来越困难。 在应用中的多个地方,控件经常需要根据某个状态来更新他们显示的内容。这种场景常见的解决方式就是定义一个接口
下一篇:android存储访问框架Storage Access Framework
在了解 storage access framework 之前,我们先来看看 android4.4 中的一个特性。如果我们希望能选择 android 手机中的一张图片,通常都是发送一个 Intent 给相应的程序,一般这个程序是系统自带的图库应用(如果你的手机中有两个图库类的 app 很可能会叫你