我正在探索从两个或更多连接表中优雅地获取数据的不同方法。
我相信MergeCursor
(Android Developer Guide)似乎暗示可以(例如)通过连接两个查询(或者将视图单独添加为行,等等)来替换等价的SQL UNION
-所以,这不是我想要的。
但是我不知道CursorJoiner
和MatrixCursor
到底是用来做什么的,也不知道如何使用它们。我已经看过它们的源码了,(像往常一样)它对我来说毫无意义!我在使用中发现的它们的例子并没有清楚地解释结果是什么。我真的很感激对它们的良好描述,以及它们可能使用的上下文。
发布于 2011-04-18 20:54:19
正如您所指出的,MergeCursor
旨在“垂直”连接两个数据集,添加更多行。
CursorJoiner
旨在“水平地”连接两个数据集,添加更多列。您可以将其视为类似于实现一个简单的SQL JOIN
。
MatrixCursor
允许您使用纯数据构建实现Cursor
接口的东西,并将其注入二维数据模型中。
AbstractCursor
允许您将自己的自定义数据集包装在Cursor
接口中,覆盖必要的方法。
发布于 2017-09-15 16:01:01
关于MatrixCursor,这里有一个使用示例。
这将返回数据的解密版本(在本例中只有一列,但在完整版本中,许多列是加密的)。
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;
}
简而言之,除了在创建实例时定义列之外,它与使用普通游标略有不同。然后,您可以使用addRow
方法添加行。
https://stackoverflow.com/questions/5701545
复制相似问题