[英]Best way to pass array of integers to sqlite for an 'IN' clause
我正在實現一個圖像dao,它根據client_type(例如dropbox,facebook等)選擇圖像,如下所示:
從任何與提供的客戶端類型列表匹配的已啟用客戶端返回結果:
//clientTypes is an array of NSNumber objects - there's an enum for each client type
- (NSArray*)listByClientTypes:(NSArray*)clientTypes
{
__block NSArray* results;
[[self.manager queue] inDatabase:^(FMDatabase* database)
{
NSMutableArray* mappedResults = [[NSMutableArray alloc] init];
NSString* sql = @"SELECT IMAGE_ADDRESS, CLIENT_TYPE, CREATED, FK_LOCATIONS_UNIQUE_COORD, PLACE_NAME, CITY, COUNTRY, IMAGE "
"FROM IMAGES LEFT JOIN LOCATIONS ON IMAGES.FK_LOCATIONS_UNIQUE_COORD = LOCATIONS.UNIQUE_COORD "
"WHERE CLIENT_TYPE IN (SELECT CLIENT_TYPE FROM CLIENT_STATE WHERE ENABLED = 1) "
"AND CLIENT_TYPE IN (%@)"; // <------- THIS IS THE LIST OF CLIENTS
FMResultSet* resultSet = [database executeQuery:sql];
while ([resultSet next])
{
[mappedResults addObject:[self extractImageFrom:resultSet]];
}
results = [mappedResults copy];
}];
return results;
}
傳遞“ IN”子句的最佳方法是什么?
通常我會使用參數綁定(例如'?'),但是我不知道如何為未知數量的參數執行此操作。 這可能嗎?
如果需要更好的方法,我打算只將逗號分隔的列表替換為SQL查詢。 。 鑒於它們只是整數,因此這將是非常安全的。
如果您使用的是非整數數據類型,則使用SQL綁定非常重要,如@MartinR 在此處的答案所述。 這是為了:
給定的是,在您的情況下,您有一個整數列表,可以嘗試如下操作:
NSString *sql =
[NSString stringWithFormat:@"SELECT IMAGE_ADDRESS, CLIENT_TYPE, CREATED, FK_LOCATIONS_UNIQUE_COORD, PLACE_NAME, CITY, COUNTRY, IMAGE "
"FROM IMAGES LEFT JOIN LOCATIONS ON IMAGES.FK_LOCATIONS_UNIQUE_COORD = LOCATIONS.UNIQUE_COORD "
"WHERE CLIENT_TYPE IN (SELECT CLIENT_TYPE FROM CLIENT_STATE WHERE ENABLED = 1) "
"AND CLIENT_TYPE IN (%@)",[clientTypes componentsJoinedByString:@"','"]];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.