如何在我的Android应用程序中join两个SQLite表?

背景

我有一个Android项目,有两个表的数据库: tbl_questiontbl_alternative

用问题和替代方法填充视图,我正在使用游标。 在我尝试join这两个表之前,获取所需的数据没有任何问题。

     Tbl_question  
     -------------
     _ID  
    题  
    类别ID  
     Tbl_alternative
     ---------------
     _ID 
     questionid 
    类别ID 
    替代

我想要的东西如下:

 SELECT tbl_question.question, tbl_alternative.alternative where categoryid=tbl_alternative.categoryid AND tbl_question._id = tbl_alternative.questionid.` 

这是我的尝试:

 public Cursor getAlternative(long categoryid) { String[] columns = new String[] { KEY_Q_ID, KEY_IMAGE, KEY_QUESTION, KEY_ALT, KEY_QID}; String whereClause = KEY_CATEGORYID + "=" + categoryid +" AND "+ KEY_Q_ID +"="+ KEY_QID; Cursor cursor = mDb.query(true, DBTABLE_QUESTION + " INNER JOIN "+ DBTABLE_ALTERNATIVE, columns, whereClause, null, null, null, null, null); if (cursor != null) { cursor.moveToFirst(); } return cursor; 

我发现这种方式比常规的SQL更难形成查询,但是由于它不太容易出错,所以得到了使用这种方法的build议。

如何在我的应用程序中join两个SQLite表?

你需要rawQuery方法。

例:

 private final String MY_QUERY = "SELECT * FROM table_a a INNER JOIN table_b b ON a.id=b.other_id WHERE b.property_id=?"; db.rawQuery(MY_QUERY, new String[]{String.valueOf(propertyId)}); 

使用 ? 绑定,而不是将值放入原始的SQL查询。

另一种方法是构build一个视图,然后像桌子一样查询。 在许多使用视图的数据库pipe理器可以导致更好的性能。

 CREATE VIEW xyz SELECT q.question, a.alternative FROM tbl_question AS q, tbl_alternative AS a WHERE q.categoryid = a.categoryid AND q._id = a.questionid; 

这是来自内存,所以可能会有一些语法问题。 http://www.sqlite.org/lang_createview.html

我提到了这个方法,因为那样你就可以在视图中使用SQLiteQueryBuilder,因为你暗示它是首选的。

除了@ pawelzieba的答案,这绝对是正确的,join两个表,而你可以使用这样一个INNER JOIN

 SELECT * FROM expense INNER JOIN refuel ON exp_id = expense_id WHERE refuel_id = 1 

通过这样的原始查询 –

 String rawQuery = "SELECT * FROM " + RefuelTable.TABLE_NAME + " INNER JOIN " + ExpenseTable.TABLE_NAME + " ON " + RefuelTable.EXP_ID + " = " + ExpenseTable.ID + " WHERE " + RefuelTable.ID + " = " + id; Cursor c = db.rawQuery( rawQuery, null ); 

由于SQLite向下兼容支持查询的原始方式,我们把这个命令转换成这个 –

 SELECT * FROM expense, refuel WHERE exp_id = expense_id AND refuel_id = 1 

因此能够采用SQLiteDatabase.query()辅助方法的优点

 Cursor c = db.query( RefuelTable.TABLE_NAME + " , " + ExpenseTable.TABLE_NAME, Utils.concat(RefuelTable.PROJECTION, ExpenseTable.PROJECTION), RefuelTable.EXP_ID + " = " + ExpenseTable.ID + " AND " + RefuelTable.ID + " = " + id, null, null, null, null ); 

有关详细的博客文章,请查看http://blog.championswimmer.in/2015/12/doing-a-table-join-in-android-without-using-rawquery

“不明确的列”通常意味着至less在两个表中出现相同的列名; 数据库引擎不能告诉你想要哪一个。 使用完整的表名或表别名来消除歧义。

这是我编辑中碰巧遇到的一个例子。 这是从别人的问题出发,但无论如何应该是有道理的。

 select P.* from product_has_image P inner join highest_priority_images H on (H.id_product = P.id_product and H.priority = p.priority)