【问题标题】:When to use CursorJoiner / MatrixCursor / MergeCursor?何时使用 CursorJoiner / MatrixCursor / MergeCursor?
【发布时间】:2011-04-18 10:28:46
【问题描述】:

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

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

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

【问题讨论】:

    标签: android matrixcursor mergecursor


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢,我现在很清楚 MergeCursor 和 CursorJoiner。我仍然对 MatrixCursor 感到有些困惑。也许我应该阅读扩展 AbstractCursor。
    • @Jodes:“如果你有一个不在数据库中的数据集合,并且你想为它创建一个游标,MatrixCursor 很有用。” Android Advanced Cursors
    • 非常有用的答案。这里有趣的一点是CursorJoiner 不是Cursor 对象,因此(几乎)完全没用,因为如果你想访问像Cursor 这样的连接数据,你需要手动创建一个MatrixCursor from它(顺便说一句,没有可用的工具或其他方法来完成此任务)。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-04
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      • 2013-08-24
      • 2013-03-09
      • 2014-04-05
      • 2020-04-25
      相关资源
      最近更新 更多