2012-04-14 57 views
0

我想出了以下查询:放置在那里的条件

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(此查询),并相应地获取行。我无法理解如何在条件(也包含子查询)的位置放置这个大的字符串来代替“字符串选择”,即该方法的第3个参数。我应该简单地将第三个参数中的整个部分(包括子查询)作为字符串写入,否则还有其他更好的方法可以做到这一点吗?

请给我建议最好的方法来做同样的事情。

问候,

回答

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 
0

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

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

确保在多个设备上测试此查询(除非受影响的行数不重要)。您可以通过将其分成多个报表来获得一些业绩,首先简单地检索预订详情,获取房间详情。

+0

请注意sixfeetsix关于使用选择参数的评论。除非你确定你的论点已被消毒,否则注射是需要考虑的。 – 2012-04-14 11:43:02