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

如果想得到一个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相同,不再赘述!