放置where条件

时间:2012-04-14 11:21:50

标签: android android-emulator sqlite

我提出了以下问题:

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';

我需要将此查询放在方法SQLiteDatabase.query()中并相应地获取行。我无法理解如何将这个大的where条件(也包含一个子查询)放在“String selection”的位置,即方法的第三个参数。我应该简单地将整个where部分(包括子查询)写成第3个参数中的字符串,否则还有其他更好的方法可以做同样的事情吗?

请建议我做同样的最好方法。

此致

2 个答案:

答案 0 :(得分:1)

我肯定会使用rawQuery而不是查询。这里重要的是你使用selectionArgs参数来防止注入。

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

答案 1 :(得分:0)

是的,您只需提供完整的“where condition”(不包括“WHERE”,包括逐字子查询)作为SqliteDatabase.query()的selection参数。

您需要担心的是性能。您事先并不知道在数据库设备上将遇到哪种SQLite版本,并且已知子查询有时执行得相当糟糕,尤其是在与LIMIT子句结合使用时。

确保在许多设备上测试此查询(除非受影响的行数很少)。您可以通过将其分成多个语句来获得一些性能,首先只需检索预订详细信息,获取房间详细信息。