2016-11-26 2 views
0

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

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

Я создал файл 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 Manager, будет ли она показывать обновленные данные в ней?

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

ответ

1

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

+0

ok. Я получаю то, что вы пытаетесь сказать или проблема. так что я должен здесь делать сейчас. Я впервые внедряю sqlite в режиме реального времени. я следил за многими учебниками, но не смог найти идеальную процедуру для него. какую процедуру кода я должен соблюдать в соответствии с вами? вы можете мне вести? любая ссылка? или любую ссылку? или любой код? все, что у вас есть. – Moxarth

+0

как вы предположили, я изменил код соответственно, – Moxarth

+0

// Получить каталог документов NSArray * documentPaths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); NSString * documentsDir = [documentPaths objectAtIndex: 0]; // Создаем путь к файлу базы данных self.databasePath = [documentsDir stringByAppendingPathComponent: @ "Database.sqlite"]; – Moxarth

Смежные вопросы