Как показать отличительное значение из таблицы Sqllite в iOS?

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

Я добавил данные в мою таблицу Sqllite

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
sqlite3_stmt    *statement;
const char *dbpath = [_databasePath UTF8String];

if (sqlite3_open(dbpath, &_myDatabase) == SQLITE_OK) {

    NSString *insertSQL = [NSString stringWithFormat:
                           @"INSERT INTO ALLREADTABLE (PostId, PostTitle, ImageLink, ShortDescription,Category,PostDate) VALUES (\"%@\", \"%@\", \"%@\", \"%@\",\"%@\",\"%@\")",
                           post_id, cell.headLabel.text, image,self.shortDiscription,cell.categoryLabel.text,cell.timeLabel.text];

    const char *insert_stmt = [insertSQL UTF8String];
    sqlite3_prepare_v2(_myDatabase, insert_stmt,
                       -1, &statement, NULL);
    if (sqlite3_step(statement) == SQLITE_DONE)
    {
        NSString *string=[NSString stringWithFormat:@"Value Added %@ %@ %@ %@ %@ %@",post_id, cell.headLabel.text, image,self.shortDiscription,cell.categoryLabel.text,cell.timeLabel.text];
        NSLog(@"String %@",string);
    } else
    {
        NSLog(@"Failed to add contact");
    }
    sqlite3_finalize(statement);
    sqlite3_close(_myDatabase);
}

Затем он добавляет данные в базу данных, как я хочу, и он также добавляет дублирующее значение в таблицу, поэтому для различного значения я пишу код для выборки данных, как

- (void)getTextFomDB
{
NSString *docsDir;
NSArray *dirPaths;

// Get the documents directory
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = dirPaths[0];

// Build the path to the database file
_databasePath = [[NSString alloc]
                initWithString: [docsDir stringByAppendingPathComponent:
                                 @"sampleDatabase.db"]];

const char *dbpath = [_databasePath UTF8String];
sqlite3_stmt    *statement;

if (sqlite3_open(dbpath, &_myDatabase) == SQLITE_OK)
{
    NSString *querySQL = @"SELECT DISTINCT PostId, PostTitle, ImageLink, ShortDescription,Category,PostDate FROM ALLREADTABLE";

    const char *query_stmt = [querySQL UTF8String];

    if (sqlite3_prepare_v2(_myDatabase, query_stmt, -1, &statement, NULL) == SQLITE_OK)
    {
        [self.postId removeAllObjects];
        [self.postTitle removeAllObjects];
        [self.imageLink removeAllObjects];
        [self.shortDecsription removeAllObjects];
        [self.category removeAllObjects];
        [self.postDate removeAllObjects];
        while (sqlite3_step(statement) == SQLITE_ROW) {
            //NSString *personID = [[NSString alloc] initWithUTF8String: (const char *) sqlite3_column_text(statement, 0)];
            NSString *postId = [[NSString alloc] initWithUTF8String: (const char *) sqlite3_column_text(statement, 1)];
            NSString *postTitle = [[NSString alloc] initWithUTF8String: (const char *) sqlite3_column_text(statement, 2)];
            NSString *ImageLink = [[NSString alloc] initWithUTF8String: (const char *) sqlite3_column_text(statement, 3)];
            NSString *shortDescrip = [[NSString alloc] initWithUTF8String: (const char *) sqlite3_column_text(statement, 4)];
            NSString *Category = [[NSString alloc] initWithUTF8String: (const char *) sqlite3_column_text(statement, 5)];
            NSString *postDate = [[NSString alloc] initWithUTF8String: (const char *) sqlite3_column_text(statement, 6)];
            [self.postId addObject:[NSString stringWithFormat:@"%@ ", postId]];
            [self.postTitle addObject:[NSString stringWithFormat:@"%@ ",postTitle]];
            [self.imageLink addObject:[NSString stringWithFormat:@"%@",ImageLink]];
            [self.shortDecsription addObject:[NSString stringWithFormat:@" %@",shortDescrip]];
            [self.category addObject:[NSString stringWithFormat:@" %@",Category]];
            [self.postDate addObject:[NSString stringWithFormat:@" %@",postDate]];
        }
        sqlite3_finalize(statement);
    }
    sqlite3_close(_myDatabase);
}
}

Тогда это даст мне ошибку вроде как

[NSPlaceholderString initWithUTF8String:]: NULL cString

Здесь я хочу отличную ценность от моего SqlliteTable. Пожалуйста, дайте мне решение для этого. Я знаю, что это легко, но я новичок в базе данных, поэтому, пожалуйста, извините и спасибо заранее.

2 ответа

Решение

Ты используешь initWithUTF8String чтобы получить значения из базы данных, поэтому, если в базе данных есть поле, которое принимает нулевые данные, то это приведет к ошибке при попытке получить нулевые данные из базы данных.

Я предлагаю вам заменить весь код извлечения данных, как

NSString *postId = [[NSString alloc] initWithUTF8String: (const char *) sqlite3_column_text(statement, 1)];

с кодом ниже:

NSString *postId = [NSString stringWithUTF8String:(const char *) sqlite3_column_text(statement, 1)];

Это заменит ненулевые данные на пустую строку.

Это вызвано попыткой создать объект NSString с NULL строка. Это на одной из этих строк:

[[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, ...)];

Итак, перед тем как создать NSString с результатами оператора sql, вам нужно проверить NULL следующим образом:

char *tmp = sqlite3_column_text(statement, 1);
if (tmp == NULL)
    postId = nil;
else
    postId = [[NSString alloc] initWithUTF8String:tmp];

Ссылка: lnafziger

Другие вопросы по тегам