SQLiteDatabase.execSQL не работает должным образом для запроса INSERT INTO - PullRequest
5 голосов
/ 26 января 2012

Я портирую код 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 + "*';");

Когда я выполняю этот код, я всегда получаю только одну строку из первого вызова execSQL () с INSERT,Я знаю, что в таблице 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 (), каковы его ограничения и какова самая быстрая альтернатива тому, что я хочу сделать?Большое спасибо за любую помощь!

1 Ответ

0 голосов
/ 30 января 2012

Согласно документации SQLiteDatabase в этом случае нельзя использовать execSQL . Попробуйте вместо этого выполнить этот оператор с помощью rawQuery.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...