2012-04-14 3 views
0

ich mit der folgenden Abfrage kam:Platzierung der where Bedingung

SELECT ROOMNO,BUILDINGNO 
FROM MRM_ROOM_DETAILS 
WHERE ROOMID IN (
    SELECT distinct roomid 
    FROM MRM_BOOKING_DETAILS 
    WHERE (CHECKIN NOT BETWEEN '2012-04-13 09:50:00' AND '2012-04-13 10:20:00') 
    AND (CHECKOUT NOT BETWEEN '2012-04-13 09:50:00' AND '2012-04-13 10:20:00')) 
AND CAPACITY > 15 
AND PROJECTIONSTATUS = 'NO'; 

ich diese Abfrage in der Methode SQLiteDatabase.query vergeben müssen() und die Zeilen entsprechend holen. Ich bin nicht in der Lage zu verstehen, wie diese große Where-Bedingung (die auch eine Unterabfrage enthält) anstelle der "String-Auswahl" gesetzt wird, d. H. Der dritte Parameter der Methode. Soll ich einfach den gesamten where-Teil (einschließlich der Unterabfrage) als String in den dritten Parameter schreiben oder gibt es sonst noch einen besseren Weg, das gleiche zu tun?

Bitte schlagen Sie mir die beste Möglichkeit vor, das gleiche zu tun.

Grüße,

Antwort

1

ich auf jeden Fall rawQuery anstatt Abfrage verwenden würde. Wichtig ist, dass Sie das Argument selectionArgs verwenden, um eine Injektion zu verhindern.

string sql = "SELECT ROOMNO,BUILDINGNO 
FROM MRM_ROOM_DETAILS 
WHERE ROOMID IN (
    SELECT distinct roomid 
    FROM MRM_BOOKING_DETAILS 
    WHERE (CHECKIN NOT BETWEEN '2012-04-13 09:50:00' AND '2012-04-13 10:20:00') 
    AND (CHECKOUT NOT BETWEEN '2012-04-13 09:50:00' AND '2012-04-13 10:20:00')) 
AND CAPACITY > 15 
AND PROJECTIONSTATUS = 'NO';"; 
db.rawQuery(sql, null); // <---- here null would be replaced with your 
         // parameters in order to prevent injection 
0

Ja, liefern Sie einfach die komplette "in dem die Bedingung" (mit Ausnahme der "WHERE", einschließlich der wörtlich subquery) als selection Argument SqliteDatabase.query().

Worüber Sie sich Gedanken machen müssen, ist Leistung. Sie wissen nicht im Voraus, welche SQLite-Version auf Ihrem Datenbankgerät vorkommt, und es ist bekannt, dass Unterabfragen manchmal ziemlich schlecht funktionieren, besonders wenn sie mit einer LIMIT-Klausel kombiniert werden.

Stellen Sie sicher, dass diese Abfrage auf mehreren Geräten getestet wird (sofern die Anzahl der betroffenen Zeilen nicht trivial ist). Sie können etwas Leistung erzielen, indem Sie sie in mehrere Anweisungen aufteilen, indem Sie einfach die Buchungsdetails abrufen und die Zimmerdetails abfragen.

+0

Beachten Sie sixfeetsix 'Kommentar zur Verwendung der Auswahlargumente. Wenn Sie nicht sicher sind, ob Ihre Argumente bereinigt sind, sollten Sie über die Injektion nachdenken. –