目前,我有一个帖子表和一个用户表。当然,每个用户可以与多个帖子相关联。 post表中的每一行都存储创建帖子的用户的用户ID。以下是示例行:
发布行:post_id标题user_id
用户行:user_id user_name
我希望通过将post表中的用户ID与user表中的用户ID相匹配来返回包含post行及其相应用户行的Cursor。我将使用什么类型的查询来实现此目的?结果应该是:
合并行:post_id标题user_id user_name
更一般地说:如何将基于共享数据的两个独立表中的数据合并到一个Cursor中?
答案 0 :(得分:10)
您可以使用CursorJoiner来获得类似于将两个Cursor合并为一个的东西。 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;
}
}
答案 1 :(得分: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是您根据共享数据组合数据的地方。