NSInvalidException: NULLcString в iPhone с использованием SQLite - PullRequest
0 голосов
/ 17 августа 2010

Я отображаю контакты на столе.Раздел, который я передаю в методе, называется именем раздела, то есть AZ .. и индекс является индексом строки в этом конкретном разделе.Таким образом, чтобы получить идентификатор на основе строки, которую я коснулся в определенном разделе, я написал следующий метод.Я пытаюсь получить идентификатор из базы данных, значения которой совпадают с запросом, который я передаю.Поэтому, если я проверяю имена, начинающиеся с буквы «А», то в разделе А будет около 4 значений. Поэтому я взял переменную i и пытался увеличивать ее до тех пор, пока она не найдет правильный индекс, чтобы он возвращал идентификатор для этого конкретного индекса.Условие проверяется, но когда я пытаюсь получить sid, оно выдает objc_exception_throw.Когда я попытался добавить точку отладки, я обнаружил, что исключение находится в этой строке, и в отладчике оно говорит NSInvalidArgumentException: NULLcString ..

Пожалуйста, помогите мне .. Это очень срочно, и я не знаю, что делать..Спасибо за помощь !!!

Ошибка в строке, где я получаю sid

Вот метод:

-(NSString *)getSugarIdNSString *)tableName bySectionNSString *)section andIndexint)inde
{
int i=0;
NSString *sid;
NSString *qsql = [[NSString stringWithFormat: @"SELECT sugar_id FROM CONTACTS WHERE first_name LIKE '%@",section] stringByAppendingString:@"%'"];
sqlite3_stmt *statement;
if (sqlite3_prepare_v2( db, [qsql UTF8String], -1, &statement, nil) == SQLITE_OK) {
while (sqlite3_step(statement) == SQLITE_ROW) {
char * utf8string = (char *)sqlite3_column_text(statement, 1);
        if(i==index){
            sid = utf8string ? [[NSString stringWithUTF8String:utf8string] : nil;
        //  sid = [[NSString alloc]initWithUTF8String:(char *)sqlite3_column_text(statement, 1)];
            break;
        }

i++;
}
}
return sid; 
}

1 Ответ

1 голос
/ 17 августа 2010

Это означает именно то, что написано: вы передаете пустую C-строку, которая часто неверна.

char * utf8string = sqlite3_column_text(statement, 1);
sid = utf8string ? [NSString stringWithUTF8String:utf8string] : nil;

Другие проблемы:

  • [[NSString stringWithFormat:@"... '%@",section] stringByAppendingString:@"%'"]; лучше записать как [NSString stringWithFormat:@"... '%@', section].
  • Вместо того, чтобы склеивать строки, рассмотрите возможность использования подготовленных операторов:
    sqlite3_prepare_v2(db, "SELECT ... WHERE first_name LIKE ?1", -1, &statement, nil);
    sqlite_bind_text(statement, 1, [section UTF8String], -1, SQLITE_TRANSIENT);
  • Я не думаю, что Sqlite3 гарантирует возвращаемый заказ, если у вас нет предложения ORDER BY. Попробуйте "ЗАКАЗАТЬ ВПЕРЕД".
  • Проходить через все ряды утомительно. Рассмотрим «ПРЕДЕЛ 1 СМЕЩЕНИЕ? 2» (или эквивалент «ПРЕДЕЛ? 2, 1») и выполните sqlite3_bind_int(statement, 2, index).
  • Подготовка выписки стоит дорого (часто дороже, чем ее выполнение); стоит их кешировать. Вы можете использовать sqlite3_reset () для сброса оператора и затем связать с ним новые значения.
  • Выполнение оператора для каждого запроса также дорого. Почему бы вам просто не сохранить все строки, возвращенные в массив?
  • Ваш код просачивается sid (просто используйте + [NSString stringWithUTF8String:]).
  • Ваш код пропускает statement (он должен быть освобожден с помощью sqlite3_finalize()).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...