Как решить проблему ошибки времени выполнения NSString, sqlite3_column_text NULL? - PullRequest
2 голосов
/ 09 марта 2010

Я новичок в разработке приложений для iphone. Я использую базу данных sqlite3, а в приложении делегат я правильно следую коду и правильно работаю, мы также находим значение из базы данных в моем приложении,

но приложение сразу понимает, почему это происходит, я не понимаю.

код указан ниже

        -(void)Data
      {
   databaseName = @"dataa.sqlite";

        NSArray *documentPaths =   NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
      NSString *documentsDir = [documentPaths objectAtIndex:0];
     databasePath =[documentsDir stringByAppendingPathComponent:databaseName];

    [self checkAndCreateDatabase];

    list1 = [[NSMutableArray alloc] init];  

    sqlite3 *database;
    if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)
    {
       if(detailStmt == nil)
        {
                    const char *sql = "Select * from Dataa";            
             if(sqlite3_prepare_v2(database, sql, -1, &detailStmt, NULL) ==    SQLITE_OK)
            {               
                    //NSLog(@"Hiiiiiii");
                //sqlite3_bind_text(detailStmt, 1, [t1 UTF8String], -1,    SQLITE_TRANSIENT);
                //sqlite3_bind_text(detailStmt, 2, [t2 UTF8String], -2, SQLITE_TRANSIENT);
                  //sqlite3_bind_int(detailStmt, 3, t3);

                   while(sqlite3_step(detailStmt) == SQLITE_ROW) 
                 {
                    //NSLog(@"Helllloooooo");




                     NSString *item= [NSString stringWithUTF8String:(char *)sqlite3_column_text(detailStmt, 0)];
                //NSString *fame= [NSString stringWithUTF8String:(char *)sqlite3_column_text(detailStmt, 1)];
                //NSString *cinemax = [NSString stringWithUTF8String:(char *)sqlite3_column_text(detailStmt, 2)];
                //NSString *big= [NSString stringWithUTF8String:(char *)sqlite3_column_text(detailStmt, 3)];

                //pvr1 = pvr;
                item1=item;
                //NSLog(@"%@",item1);

                data = [[NSMutableArray alloc] init];   


                list *animal=[[list alloc] initWithName:item1];

                // Add the animal object to the animals Array
                [list1 addObject:animal];
                //[list1 addObject:item];


            }
            sqlite3_reset(detailStmt);
        }
        sqlite3_finalize(detailStmt);
        //  sqlite3_clear_bindings(detailStmt);
    }
}
detailStmt = nil;
sqlite3_close(database);

}

когда мы видим консоль, они показывают следующую ошибку, давая ниже

    2010-03-09 10:02:40.262 SanjeevKapoor[430:20b] *** Terminating app due to uncaught     exception 'NSInvalidArgumentException', reason: '*** +[NSString stringWithUTF8String:]:    NULL cString'

когда мы видим отладчик, они показывают ошибку в следующей строке

          NSString *item= [NSString stringWithUTF8String:(char *)sqlite3_column_text(detailStmt, 0)];

Я не могу решить, что проблум, пожалуйста, помогите мне.

Ответы [ 3 ]

14 голосов
/ 18 августа 2010

Вы можете использовать NSString stringWithFormat:@"%s". это также изящно обрабатывает NULL значения.

9 голосов
/ 09 марта 2010

Sqlite может хранить объекты NULL, которые не совпадают с пустыми строками. В вашем случае вы извлекли значение из базы, а результат был NULL. Но метод [NSString stringWithUTF8String:] не может использовать NULL в качестве аргумента, поэтому он вызывает ошибку. Вы должны проверить извлеченное значение:

char * str = (char*)sqlite3_column_text(statement, i);
if (str){
    item = [NSString stringWithUTF8String:str];
}
else{
    // handle case when object is NULL, for example set result to empty string:  
    item = @"";
}
3 голосов
/ 27 августа 2013

Вы можете использовать:

((char *)sqlite3_column_text(sqlStatement, 11)) ? [NSString stringWithUTF8String:(char *)sqlite3_column_text(sqlStatement, 11)] : nil;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...