Как объединить const char в const char? - PullRequest
0 голосов
/ 21 ноября 2011

Мне нужно создать const char строку из других const char?

const char *sql = "";
const char *sqlBuild = "";

for(int i=0; i < ac_count; ++i) {

  if (![sqlBuild isEqualToString:@""]) {
     sqlBuild = [sqlBuild stringByAppendingString:
           [NSString stringWithUTF8String:@" UNION "]];
  }
  sql = [[NSString stringWithFormat:
      @"select sum(price) from tmp%d  where due >= date() and due <= '%@'",  
            i, strDBDate] cStringUsingEncoding:NSUTF8StringEncoding];

  sqlBuild = [sqlBuild stringByAppendingString:
       [NSString stringWithUTF8String:sql]];
}

//execute sql

У меня было несколько попыток, но я не могу сделать это совершенно правильно, вот моя последняя попытка.Как вы можете видеть, я пытаюсь создать SQL-оператор.

Куда я иду?.

- (NSString*)getCategoryDesc:(int)pintCid {

NSString *ret = @"";
const char *sql = "select category from categories where cid = ?";

sqlite3 *database;
int result = sqlite3_open([[General getDBPath] UTF8String], &database);
if(result != SQLITE_OK)
{
    DLog(@"Could not open db.");
}

sqlite3_stmt *statementTMP;

int error_code = sqlite3_prepare_v2(database, sql, -1, &statementTMP, NULL);

if(error_code == SQLITE_OK) {

    sqlite3_bind_int(statementTMP, 1, pintCid);

    if (sqlite3_step(statementTMP) == SQLITE_ROW) {
        ret = [[NSString alloc] initWithUTF8String:
            (char *)sqlite3_column_text(statementTMP, 1)];
    }
}
sqlite3_finalize(statementTMP);
sqlite3_close(database);


return [ret autorelease];
}

Ответы [ 2 ]

3 голосов
/ 21 ноября 2011

Преобразование в строку UTF8 и обратно в нее не имеет смысла; было бы гораздо эффективнее сделать все в NSString и преобразовать его в строку в стиле C в конце. Синтаксис @"d" также оценивает объект, а не строку в стиле C.

Так что вы должны упростить и исправить свой код так:

NSMutableString *sqlStatement = [NSMutableString string];

for(int i=0; i < ac_count; ++i) {

  if ([sqlStatement length])  [sqlStatement appendString:@" UNION "];

  [sqlStatement appendFormat:
      @"select sum(price) from tmp%d  where due >= date() and due <= '%@'",  
            i, strDBDate];

}

// execute SQL string [sqlStatement UTF8String]
2 голосов
/ 21 ноября 2011

Объявите sqlBuild как NSMutableString и используйте его для построения вашей строки:

NSMutableString *sqlBuild = [NSMutableString string];
for (...) {
    [sqlBuild appendString:...];
}
...