2012-01-26 15 views
5

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!

Odpowiedz

0

Zgodnie z dokumentacją w tym przypadku nie można użyć numeru execSQL. Spróbuj zamiast tego wykonać instrukcję z rawQuery.

+0

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ą. –

+0

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

+0

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); –

Powiązane problemy