Android SQLite使用db.query()进行JOIN而不是rawquery()

use*_*656 14 sqlite android

我有tableA,tableB和tableC表A和tableB由tableA.Id(PK)= tableB.tableAId(FK)连接表B和tableC由ta​​bleB.Id(PK)= tableC.tableBId(FK)连接

我希望能够这样做:

SELECT c.ALL from tableC c
INNER JOIN tableB b on c.tableBId = b.Id
INNER JOIN tableA a on b.tableAId = a.Id
WHERE a.Id = 108
Run Code Online (Sandbox Code Playgroud)

我在网上发现了很多帖子,它们使用db.rawquery()来实现这个查询.但是我也听说rawquery()不如query()安全.因此,为了寻求初学者的最佳实践,我的问题是:

有没有办法使用db.query()而不是db.rawquery()来实现此查询?

提前致谢.

Sim*_*iak 20

有没有办法使用db.query()而不是db.rawquery()来实现此查询?

所以值得一提的是,rawQuery()是一个技巧.但也存在另一种方法.

query()方法用于在一个表上执行查询.但是JOIN在SQLite中如何使用表的最佳方法是使用SQLiteQueryBuildersetTables()方法,你可以加入.

因此,我建议您使用提到的SQLiteQueryBuilder.但是对于需要仅分配原始语句的rawQuery()方法,它要复杂一些.

如果不知道如何开始,请检查以下示例:

注意:

事实rawQuery()是不如query()因为query()方法使用比"原始"语句更安全的预编译语句更安全.但是,你总是可以(应该)使用占位符来显着提高声明的安全性,因为主要的防止SQL注入和声明变得更加人性化.


Nim*_*yan 20

这有点晚了,但我认为其他正在寻找的人可能从中受益:

db.query()方法本身支持LEFT OUTER JOINAND INNER JOIN通过其table参数,所以你实际上不需要SQLiteQueryBuilder用来实现它.此外,它更容易,而且非常直接.

此方法广泛用于Google I/O 2015 Schedule app的源代码.

一个快速示例(为简洁起见,遗漏了字符串常量):

Cursor cursor = db.query(NoteContract.Note.TABLE_NAME 
+ " LEFT OUTER JOIN authors ON notes._id=authors.note_id", projection, selection, 
selectionArgs, null, null, "notes._id");
Run Code Online (Sandbox Code Playgroud)

关键在于第一个参数db.query().

目前,仅支持LEFT OUTER JOININNER JOIN支持,这对于大多数应用来说已经足够了.

我希望这个答案可以帮助那些正在寻找这个的人.