Данные не могут быть получены при выборе из базы данных sqlite

Данные не могут быть извлечены при выборе из базы данных sqlite, и при выполнении функции шага отображается ошибка [NSPlaceholderString initWithUTF8String:]: NULL cString'.

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

я создал файл database.sqlite, внутри таблицы news_array с 4 столбцами (N_id, N_Title, N_Desc,N_img), из менеджера sqlite и сохранил его. Затем я перетащил файл.sqlite в проект. добавлен libsqlite3.tbd и импортирован sqlite3.h .

Затем в файле.m я создал операцию вставки и попытался вставить данные массива в базу данных.

-(void)insert
NSArray *documentPaths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);

NSString *documentsDir = [documentPaths objectAtIndex:0];

NSString *databasePath = [documentsDir stringByAppendingPathComponent:@"Database.sqlite"];

NSString *databasePathFromApp = [ [ [NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Database.sqlite"];

NSFileManager *fileManager = [NSFileManager defaultManager];

if ( ![ fileManager fileExistsAtPath:databasePathFromApp ] )

    return;

[ fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil ];

sqlite3 *database;

if (sqlite3_open( [databasePath UTF8String], &database) == SQLITE_OK)
{
    for (int i = 0; i < 10 ; i++)
    {
 NSString * nwsid = [[arrydata_tbl objectAtIndex:i]objectForKey:@"NewsId"];
int myInt = [nwsid intValue];
NSString * nwsttl = [[arrydata_tbl objectAtIndex:i]objectForKey:@"NewsTitle"];
NSString * nwsdesc = [[arrydata_tbl objectAtIndex:i]objectForKey:@"NewsDescription"];
        NSData * nwsimg = [[arrydata_tbl objectAtIndex:i]objectForKey:@"NewsImage"];

         const char *insert_stmt ="INSERT INTO news_array (N_id, N_Title , N_Desc ,N_img )VALUES (?,?,?,?);";
        sqlite3_stmt *compiledStatement;

        sqlite3_prepare_v2(database, insert_stmt,-1, &compiledStatement, NULL) ;

        {
            sqlite3_bind_int(compiledStatement, 1, myInt);
sqlite3_bind_text(compiledStatement, 2, [nwsttl UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(compiledStatement, 3, [nwsdesc UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_blob (compiledStatement, 4, [nwsimg bytes], (int)[nwsimg length], SQLITE_TRANSIENT);

if (sqlite3_step(compiledStatement) == SQLITE_DONE)

        {
            NSLog(@"Data inserted ...");
        }
             sqlite3_reset(compiledStatement);
    }
        sqlite3_finalize(compiledStatement);
}
sqlite3_close(database);
}
[self showData];
}

затем я выбираю один столбец из базы данных, чтобы увидеть, были ли данные вставлены или нет,

-(void)showData
{
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDir = [documentPaths objectAtIndex:0];

NSString *databasePath = [documentsDir stringByAppendingPathComponent:@"Database.sqlite"];

NSString *databasePathFromApp = [ [ [NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Database.sqlite"];

NSFileManager *fileManager = [NSFileManager defaultManager];

if ( ![ fileManager fileExistsAtPath:databasePathFromApp ] )

    return;

[ fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil ];

sqlite3 * database;




NSMutableArray * arry_ttl = [[NSMutableArray alloc]init];

if (sqlite3_open( [databasePath UTF8String], &database) == SQLITE_OK)
{
    NSString * insertSQL = [NSString stringWithFormat:@"SELECT N_Title FROM news_array"];

    const char *insert_stmt = [insertSQL UTF8String];
     sqlite3_stmt *compiledStatement;

    if(sqlite3_prepare_v2(database, insert_stmt,-1, &compiledStatement, NULL)==SQLITE_OK)
    {
    while (sqlite3_step(compiledStatement) == SQLITE_ROW)
    {
        NSString *title = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(compiledStatement, 1)];

        NSMutableDictionary *dic = [NSMutableDictionary new];

        [dic setObject:title forKey:@"title"];



        if(![arry_ttl containsObject:dic])
        {
            [arry_ttl addObject:dic];
           // [ary_ids addObject:id1];
        }
    }
        sqlite3_reset(compiledStatement);
 }
     sqlite3_finalize(compiledStatement);
}
sqlite3_close(database);
}

я проверил процедуру во время вставки, каждый раз (10 объектов массива за цикл) получал сообщение NSLog, когда пошаговая функция была выполнена успешно.

но в -(void) функция showdata, на шаговой функции, показывающей ошибку нулевой строки, как будто данные ничего не получают из базы данных.

так вот, что я делаю не так? я ошибаюсь где-то реализации процедуры базы данных?

и как проверить внешне, вставлены ли наши данные в базу данных или нет? Я имею в виду, если мы откроем обновленную базу данных в менеджер sqlite, он покажет обновленные данные в нем?

Пожалуйста, помогите мне прояснить мои сомнения.

1 ответ

Решение

Размещенный код копирует файл SQL из пакета, вставляет запись, а затем снова копирует исходный файл SQL из пакета, прежде чем открывать его и пытаться прочитать вновь добавленную запись. Конечно ничего не было добавлено. Вы перезаписали свой файл начальным файлом, в который ничего не было добавлено.

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