Вставка массива значений в Sqlite3 i-phone - PullRequest
0 голосов
/ 25 августа 2011

Я пытаюсь вставить набор значений в таблицу sqlite, используя цикл for. Он вставляет только один набор значений. Я публикую здесь мой код:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *databasePath = [documentsDirectory stringByAppendingPathComponent:@"myDatabase.sql"];

for(int i=0;i<[arr count];i++)
{
    sqlite3 *database;

    // Open the database from the users filessytem
    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
        NSLog(@"\n inserting data \n");
        sqlite3_exec(database, [[NSString stringWithFormat:@"INSERT INTO AnswerConnect VALUES('%@')",[arr objectAtindex:i] ] UTF8String], NULL, NULL, NULL);    
        //sqlite3_finalize(compiledStatement);
        sqlite3_close(database);
    }       
}

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 25 августа 2011

Вы должны сначала подготовить оператор sqlite для вставки данных в таблицу. Попробуйте это:

sqlite3_stmt *statement = nil    
const char *sql = "insert into tablename (col1,col2) Values( ?, ?)";

if(sqlite3_prepare_v2(database, sql, -1, &statement, NULL) != SQLITE_OK)
{
     NSLog(@"Error while creating add statement. '%s'", sqlite3_errmsg(database));
}

for(int i=0;i<[arr count];i++)
{
      sqlite3_bind_text(statement, 1,[[arr objectAtindex:i] UTF8String] , -1, SQLITE_TRANSIENT);

     if(SQLITE_DONE != sqlite3_step(add_statement))
     {
    NSLog(@"Error while inserting result data. '%s'", sqlite3_errmsg(database));
     }
     //Reset the add statement.
     sqlite3_reset(statement);
}
1 голос
/ 25 августа 2011

Не делай так!Не открывайте и не закрывайте соединение SQLite в цикле!Откройте дескриптор базы данных вне цикла и используйте указатель на нее.В запросах такого типа небезопасно вставлять формат, потому что оператор SQL может быть скомпилирован с использованием какого-либо кода внедрения.Вместо этого используйте sqlite3_stmt и привяжите к нему значения.Также, если вы скомпилируете только один экземпляр sqlite3_stmt и повторно его используете, это даст вам лучшую производительность, чем постоянная компиляция новых операторов.

Сколько столбцов в каждом наборе данных?Вставляет ли оно только одно значение из одного набора данных, например строку?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...