我正在将iOS代码移植到Android操作系统中。我执行了大量查询,将查询结果插入到一个临时表中。当所有查询完成后,我将从临时表中获取所有结果,并将其收集到我自己创建的对象集合中。我使用的是一个临时表,而不是直接选择集合,因为我相信它执行得更快,或者至少在iOS方面是这样。我的问题是execsql()不能像我预期的那样工作,下面是代码:
db.execSQL("CREATE TEMPORARY TABLE SearchResults(Name text);");
db.execSQL("INSERT INTO SearchResults (Name) SELECT Name FROM ProductNames WHERE NameLower MATCH '" + termLowerCase + "*';");
db.execSQL("INSERT INTO SearchResults (Name) SELECT Name FROM BrandNames WHERE NameLower MATCH '" + termLowerCase + "*';");
当我执行这段代码时,我只从第一次使用insert的execsql()调用中得到一行。我知道productnames表中有多个结果应该与我的术语相匹配,而且我知道brandnames表中有数百行应该与我的术语相匹配。如果我将代码更改为:
Cursor cursor = db.rawQuery("SELECT Name FROM ProductNames WHERE NameLower MATCH '" + termLowerCase + "*'", null);
cursor.moveToFirst();
while (!cursor.isAfterLast())
{
resultSet.add(cursor.getString(0));
cursor.moveToNext();
}
cursor.close();
cursor = db.rawQuery("SELECT Name FROM BrandNames WHERE NameLower MATCH '" + termLowerCase + "*'", null);
cursor.moveToFirst();
while (!cursor.isAfterLast())
{
resultSet.add(cursor.getString(0));
cursor.moveToNext();
}
我得到了我期待的所有结果。
有人能告诉我我做错了什么吗?我是否以不适当的方式使用execsql()?我假设它只是将查询传递到sqlite3_exec(),这是我在iOS上使用的方法。如果我不恰当地使用execsql(),那么它的限制是什么?除了我想做的事情,最快的选择是什么?非常感谢您的帮助!
最佳答案
根据SQLiteDatabase
文档,在这种情况下不能使用execSQL。尝试用rawquery来执行该语句。