Чтение и запись в базу данных iPhone SQLite - PullRequest
1 голос
/ 06 августа 2010

Итак, я пытаюсь работать с SQLite в одном из приложений iPhone и использую библиотеку sqlite3.Я могу получить доступ к базе данных и даже сделать запрос;фактически запрос обращается к точным данным, но по какой-то причине возвращаемая строка является длинным целым числом, а не искомой строкой.Вот база данных и код:

Filename: Package.sql
Table Lessons
LessonID VARCHAR(64) Primary Key | LessonName VARCHAR(100) | EntryDate (DATETIME) | Chrono VARCHAR (20) 
bfow02nso9xjdo40wksbfkekakoe29ak | Learning The History    | 2010-08-05 16:24:35  | 0001

И код iPhone

...
-(NSString *)getRow:(NSString *)tablename where:(NSString *)column equals:(NSString *)value {

  const char *query = [[[[[[[@"SELECT * FROM `" stringByAppendingString:tablename] stringByAppendingString:@"` WHERE `"] stringByAppendingString:column] stringByAppendingString:@"` = '"] stringByAppendingString:value] stringByAppendingString:@"';"] cStringUsingEncoding:NSUTF8StringEncoding];

  NSString *result;

  if(sqlite3_open([dbpath UTF8String], &database) == SQLITE_OK) {

    sqlite3_stmt *compiledQuery;

    if(sqlite3_prepare_v2(database, query, -1, &compiledQuery, NULL) == SQLITE_OK) {

      while(sqlite3_step(compiledQuery) == SQLITE_ROW) {

        NSString *str_temp = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledQuery, 2)];

        result = str_temp;
        
      }

      sqlite3_finalize(compiledQuery);

    }

    sqlite3_close(database);

  }
 
  return result;

}
...

Когда код выполняется:

  CDatabase *db = [[CDatabase alloc]initWithDatabase:@"Package.sql"];
  NSString *result = [db getRow:@"Lessons" where:@"Chrono" equals:@"0001"];

возвращаемое значение NSString * результат имеетзначение "1 364 111".Почему он это делает ???Это должно быть "Изучение истории"

Ответы [ 2 ]

2 голосов
/ 06 августа 2010

Вы уверены, что любой из ваших вызовов SQLite был успешным?Вы должны инициализировать result в nil, чтобы ваша функция возвращала nil, если обнаружены какие-либо ошибки.

Три (вероятно, связанные) проблемы с вашим кодом:

  1. Индекс к sqlite3_column_text должен начинаться с нуля;вы передаете 2, который должен ссылаться на третий столбец.Вы, вероятно, хотите передать 1.Начиная с документов :

    ... второй аргумент - это индекс столбца, для которого должна быть возвращена информация.Крайний левый столбец набора результатов имеет индекс 0.

  2. Вы действительно не должны использовать SELECT *.Укажите нужные столбцы!

  3. Вы должны специализировать свой запрос по значениям привязки, а не по конкатенации строк!Ваш код изобилует возможностью SQL-инъекций (не говоря уже о неправильных запросах).

Например (без проверки ошибок):

const char *query = "SELECT * FROM ? WHERE ?=?";
sqlite3_stmt *compiledQuery;
sqlite3_prepare_v2(database, query, -1, &compiledQuery, NULL);
sqlite3_bind_text(compiledQuery, 1, "Lessons", -1, SQLITE_TRANSIENT);
sqlite3_bind_text(compiledQuery, 2, "Chrono", -1, SQLITE_TRANSIENT);
sqlite3_bind_text(compiledQuery, 3, "0001", -1, SQLITE_TRANSIENT);

Обратите внимание, чтоиндекс здесь основан на 1 (я не знаю, почему они это делают).Из документов :

Второй аргумент - это индекс параметра SQL, который нужно установить.Крайний левый параметр SQL имеет индекс 1.

0 голосов
/ 03 сентября 2010

Ха-ха, к сожалению, я понял, что просто отображаю строку как формат данных, используя формат строки %d.когда я изменил его на %@, я получил формат строки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...