何时使用CursorJoiner / MatrixCursor / MergeCursor?

我正在探索不同的方式来从两个或多个连接表中优雅地获取数据。

我相信MergeCursor ( Android开发者指南 )似乎意味着可以(例如)通过连接两个查询(或单独添加视图作为行等)replace等效的SQL UNION – 所以,不是我想要的。

但是我对CursorJoinerMatrixCursor是什么,以及如何使用它们CursorJoiner MatrixCursor 。 我已经看过他们的来源,并且(像往常一样)对我来说没有任何意义! 我发现他们使用的例子并没有清楚地解释结果是什么。 我真的很感谢他们的一个很好的描述,以及他们可能使用的背景。

如您所示, MergeCursor旨在连接两个“垂直”数据集,添加更多行。

CursorJoiner被devise为连接两个数据集“水平”,增加更多的列。 你可以把它看作类似于实现一个简单的SQL JOIN

MatrixCursor允许您从纯数据中构build实现Cursor接口的东西,然后将其注入到二维数据模型中。

AbstractCursor允许您将自己的自定义数据集包装在Cursor接口中,覆盖必要的方法。

关于MatrixCursor ,这里是一个示例用法。

这将返回数据的解密版本( 在本例中只有一列,但在完整版本中,许多列被encryption )。

 public MatrixCursor decyrptedCard(long cardid) { EncryptDecrypt ed = new EncryptDecrypt(mContext, LoginActivity.getCurrentUserPassWord(), MainActivity.mCurrentUserid); String[] mcsrcolumns = { DBCardsTableConstants.CARDID.getDBColumnName(), DBCardsTableConstants.CARDNAMEONCARD.getDBColumnName() }; MatrixCursor cnvcsr = new MatrixCursor(mcsrcolumns,0); String whereclause = DBCardsTableConstants.CARDID.getDBColumnName() + "=?"; String[] whereargs = {Long.toString(cardid)}; Cursor basecsr = db.query(DBCardsTableConstants.CARDS.getDBTableName(), null, whereclause, whereargs, null,null,null,null); if (!basecsr.moveToFirst()) { cnvcsr.addRow(new Object[]{0L,"NOTACARD"}); return cnvcsr; } cnvcsr.addRow(new Object[]{ basecsr.getLong( basecsr.getColumnIndex( DBCardsTableConstants.CARDID.getDBColumnName() )), ed.decrypt( basecsr.getString( basecsr.getColumnIndex( DBCardsTableConstants.CARDNAMEONCARD.getDBColumnName() ) ) ) }); basecsr.close(); return cnvcsr; } 

简而言之,与使用普通游标几乎没有区别,除非您在创build实例时定义列。 然后,您可以使用addRow方法添加行。