首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >什么时候使用CursorJoiner / MatrixCursor / MergeCursor?

什么时候使用CursorJoiner / MatrixCursor / MergeCursor?
EN

Stack Overflow用户
提问于 2011-04-18 18:28:46
回答 2查看 10.1K关注 0票数 37

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

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

但是我不知道CursorJoinerMatrixCursor到底是用来做什么的,也不知道如何使用它们。我已经看过它们的源码了,(像往常一样)它对我来说毫无意义!我在使用中发现的它们的例子并没有清楚地解释结果是什么。我真的很感激对它们的良好描述,以及它们可能使用的上下文。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-18 20:54:19

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

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

MatrixCursor允许您使用纯数据构建实现Cursor接口的东西,并将其注入二维数据模型中。

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

票数 72
EN

Stack Overflow用户

发布于 2017-09-15 16:01:01

关于MatrixCursor,这里有一个使用示例。

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

代码语言:javascript
运行
复制
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方法添加行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5701545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档