何时使用CursorJoiner / MatrixCursor / MergeCursor?

时间:2011-04-18 10:28:46

标签: android matrixcursor mergecursor

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

我相信MergeCursor,(Android Developer Guide)似乎意味着可以(例如)通过连接两个查询(或将视图单独添加为行等)替换等效的SQL UNION - 所以,不是我想要的。

但我对CursorJoinerMatrixCursor究竟是什么以及如何使用它们感到茫然。我看了他们的来源(和往常一样)对我来说没什么意义!我发现它们在使用中的例子没有清楚地解释产生的效果是什么。我非常感谢对它们的良好描述,以及它们可能用于的背景。

2 个答案:

答案 0 :(得分:72)

正如您所指出的,

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

CursorJoiner旨在“水平”连接两个数据集,添加更多列。您可以将此视为类似于实现简单的SQL JOIN

MatrixCursor允许您使用纯数据构建实现Cursor接口的内容,然后将其转换为二维数据模型。

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

答案 1 :(得分:0)

关于 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方法添加行。