我有tableA,tableB和tableC表A和tableB由tableA.Id(PK)= tableB.tableAId(FK)连接表B和tableC由tableB.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 JOIN和INNER JOIN支持,这对于大多数应用来说已经足够了.
我希望这个答案可以帮助那些正在寻找这个的人.
| 归档时间: |
|
| 查看次数: |
19233 次 |
| 最近记录: |