9

目前,我有一个帖子表和一个用户表。自然地,每个用户都可以与多个帖子相关联。帖子表中的每一行都存储创建帖子的用户的用户 ID。以下是示例行:

帖子行:post_id 标题 user_id

用户行:user_id user_name

我想通过将 post 表中的用户 ID 与用户表中的用户 ID 匹配来返回包含 post 行及其相应用户行的 Cursor。我将使用什么类型的查询来实现这一点?结果应该是:

合并行:post_id 标题 user_id user_name

更一般地说:如何将基于共享数据的两个单独表中的数据组合到一个游标中?

4

2 回答 2

10

您可以使用 CursorJoiner 获得类似于将两个游标合并为一个的功能。CursorJoiner 实际上并不执行合并。当您对其进行迭代时,它会移动原始的两个游标,以便它们的行将在指定的列上匹配。这就是为什么有必要在连接中使用的列上对两个游标进行排序。

文档链接:http: //developer.android.com/reference/android/database/CursorJoiner.html

代码示例:

CursorJoiner joiner = new CursorJoiner(userCursor, new String[]{ "user_id" }, postCursor, new String[] {"user_id"});

while (joiner.hasNext()) {
    CursorJoiner.Result result = joiner.next();
        switch (result) {
            case LEFT:
                // don't care about this case
                break;

            case RIGHT:
                // nor this case
                break;

            case BOTH:
                // here both original Cursors are pointing at rows that have the same user_id, so we can extract values
                int postId = postCursor.getInt(...);
                String headline = postCursor.getString(...);
                int userId = userCursor.getInt(...);        
                String userName = userCursor.getString(...);

                // do something with above values

                break;

        }
}     
于 2013-07-24T19:33:28.053 回答
8

您还可以在 Android 代码中使用原始 SQLite 语句,如下所示:

SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery("SELECT serials.id, serials.cabinet_number, serials.serial_number, " +
            "configuration.frequency, configuration.ag, configuration.number_alarms, configuration.failed_rapper, configuration.max_mv, configuration.max_nav " +
            "FROM serials JOIN configuration ON serials.id = configuration.serial_id WHERE serials.id = '" + current_id + "'", null);
    cursor.moveToFirst();

在 SELECT 中,格式为table_name.column_name. ON 是您根据共享数据组合数据的位置。

于 2013-07-24T19:41:19.563 回答