我试图像Android一样在Android中执行SQL查询:
SELECT * FROM Flashcards WHERE (category = 'Anatomy' OR category = 'Surgery') AND (difficulty = 'Easy' OR difficulty = 'Medium');
Run Code Online (Sandbox Code Playgroud)
通过用户选择在运行时确定类别和困难的数量.到目前为止,我已经尝试使用带有查询参数的原始查询,但我觉得我在这种情况下正在与框架作斗争:
String query = "SELECT * FROM Flashcards WHERE (?) AND (?) ORDER BY RANDOM() LIMIT 1";
Cursor cursor = db.rawQuery(query, queryParameters);
Run Code Online (Sandbox Code Playgroud)
我尝试传入的查询参数包括:
category = 'Anatomy' OR category = 'Surgery'
Run Code Online (Sandbox Code Playgroud)
和:
category = Anatomy OR category = Surgery
Run Code Online (Sandbox Code Playgroud)
查询不会返回任何结果.在外部对同一数据库执行的相同查询会返回结果.
尝试:
String query = "SELECT * FROM Flashcards WHERE category = ? OR category = ? ORDER BY RANDOM() LIMIT 1";
Cursor cursor = db.rawQuery(query, queryParameters);
Run Code Online (Sandbox Code Playgroud)
仅供参考,参数的位置应该用?标志.
由于您希望传递字段名称和值运行时,您可以构建格式化字符串,如:
String query = "SELECT * FROM Flashcards WHERE %s AND %s ORDER BY RANDOM() LIMIT 1";
Cursor cursor = db.rawQuery(String.format(query, queryParameters));
Run Code Online (Sandbox Code Playgroud)
你需要queryParameters
像category = 'Anatomy' OR category = 'Surgery'
你提到的那样建立价值观.
我总是发现原始查询的连接字符串容易出错且乏味.我最近在Android上发布了用于sqlite操作的流畅API的初稿.有了它,您可以编写如下代码:
public void getFlashcards(SQLiteDatabase db, List<String> categories, List<String> difficulties) {
Cursor c = select()
.from("Flashcards")
.where(column("category").in(nArgs(categories.size())), categories.toArray())
.where(column("difficulty").in(nArgs(difficulties.size())), difficulties.toArray())
.orderBy("RANDOM()")
.limit(1)
.perform(db);
// do something useful with the cursor
}
private Expression[] nArgs(int size) {
return Collections.nCopies(size, Expressions.arg()).toArray(new Expression[size]);
}
Run Code Online (Sandbox Code Playgroud)
此代码将执行以下查询:
SELECT * FROM Flashcards WHERE (category IN (?, ?)) AND (difficulty IN (?, ?)) ORDER BY RANDOM() LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
?
args 的数量取决于类别的大小和传递给函数的困难集合.作为奖励点,由于查询使用绑定的args而不是原始字符串,因此您的输入将被正确转义,并且此查询的预准备语句对于内部的缓存更友好SQLiteDatabase
.
API仍然不完美,但IMO打败了基于的代码String.format()
.给它一个旋转:android-db-commons.
归档时间: |
|
查看次数: |
5447 次 |
最近记录: |