何时使用CursorJoiner / MatrixCursor / MergeCursor?
我正在探索不同的方式来从两个或多个连接表中优雅地获取数据。
我相信MergeCursor
( Android开发者指南 )似乎意味着可以(例如)通过连接两个查询(或单独添加视图作为行等)replace等效的SQL UNION
– 所以,不是我想要的。
但是我对CursorJoiner
和MatrixCursor
是什么,以及如何使用它们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
方法添加行。
- 用AESencryption/解密
- 实例化新的Android Fragment的最佳做法
- 通过ACTION_SEND在Android App上分享Facebook上的文本
- 在android phonegap中单击button时退出应用程序?
- 广播接收机内的服务
- Android Microsoft Office Library(.doc,.docx,.xls,.ppt等)
- 在TextView上设置椭圆大小可以减less显示的行数(而不是最后一个)
- 如何使用复合drawable来代替包含ImageView和TextView的LinearLayout
- Android:CursorAdapter,ListView和CheckBox