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

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

问候,

4

2 回答 2

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
于 2012-04-14T11:40:29.527 回答
0

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

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

确保在多个设备上测试此查询(除非受影响的行数微不足道)。您可以通过将其拆分为多个语句来获得一些性能,首先简单地检索预订详细信息,然后获取房间详细信息。

于 2012-04-14T11:41:38.310 回答