Przesyłam kod iOS, który działa idealnie na system operacyjny Android. Wykonuję szereg zapytań, wstawiając wyniki zapytań do tabeli tymczasowej. Po zakończeniu wszystkich zapytań przechwytuję wszystkie wyniki z tabeli tymczasowej do zbioru obiektów mojego własnego autorstwa. Używam tabeli tymczasowej zamiast wybierać bezpośrednio do kolekcji, ponieważ uważam, że działa szybciej, a przynajmniej tak czy inaczej po stronie iOS. Moim problemem jest to, że execSQL() nie działa jak by się spodziewać, oto kod:SQLiteDatabase.execSQL nie działa zgodnie z oczekiwaniami dla zapytania INSERT INTO
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 + "*';");
Kiedy wykonać ten kod mam tylko kiedykolwiek jeden wiersz z pierwszego execSQL() zadzwonić z wkładką. Wiem, że w tabeli ProductNames jest więcej niż jeden wynik, który powinien pasować do mojego terminu i wiem, że w tabeli BrandNames są setki wierszy, które powinny pasować do mojego hasła. Jeśli zmienię kod na:
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();
}
Otrzymuję wszystkie wyniki, których się spodziewam.
Czy ktoś mógłby mi powiedzieć, co robię źle? Czy używam execSQL() w niewłaściwy sposób? Zakładam, że po prostu przerzuci to zapytanie na sqlite3_exec(), którego używam w systemie iOS. Jeśli używam execSQL() w niewłaściwy sposób, jakie są jego ograniczenia i jaka jest najszybsza alternatywa dla tego, co chcę zrobić? Dziękuję bardzo za pomoc!
Uważam, że dokumentacja wskazuje, że nie należy jej używać, jeśli potrzebne są dane zwrócone z zapytania. Korzystanie z rawQuery nie wydaje się możliwe w moim scenariuszu, powyższy nieprzetworzony kod zapytania zajmuje bardzo długi czas, aby uruchomić na moim ADP2. Co więcej, przetestowałem portowanie innych moich zapytań z wersji na iOS w osobnej metodzie, która również używa INSERT INTO z SELECT przy użyciu FTS3 MATCH i wydaje się, że działają dobrze. Ten problem pozostaje tajemnicą. –
Sposób, w jaki rozumiem dokumentację mówi, że uruchomi JEDNĄ instrukcję, która NIE jest WYBOREM. Znaczenie: INSERT + SELECT narusza oba ograniczenia tej dokumentacji. Czy to działa, gdy używasz narzędzia rawQuery? Powoli, rozważ operację, którą wykonujesz ponad rozmiar danych. To nie jest trywialna operacja. – jlindenbaum
Tak, otrzymuję to, o czym tu mówisz, ale mam działające wywołania execSQL() z instrukcjami INSERT INTO i SELECT w zapytaniu. Oto przykład takiego, który działa: sql = "WSTAW NA WYSZUKIWANIA wyszukiwania (SearchOrder, PID, ProductName, DBTable)" + "SELECT 3, P.ProductID, P.Name, 0" + "Z I składników" + "INNER JOIN ProductAltNames A ON (I.IngredientsID = A.IngredientID)" + "INNER JOIN ProductNames P ON (A.ProductID = P.ProductID)" + "GDZIE I.DescriptionLower MATCH" "+ termLowerCase +" * ' "; db.execSQL (sql); –