SQLite iOS Вставка данных

Я пытаюсь вставить только одно имя в мой файл sqlite. я использую этот код, но этоне работает: /

-(void)InsertRecords:(NSMutableString *) txt{
    if(addStmt == nil) {
        const char *sql = "INSERT INTO myMovies (movieName)  VALUES(?) ";
        if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK)
            NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));
        else
            sqlite3_bind_text(addStmt, 1, [txt UTF8String], -1, SQLITE_TRANSIENT);
    }
    if(SQLITE_DONE != sqlite3_step(addStmt))

        NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));
    else
        sqlite3_reset(addStmt);
}
 adum25 окт. 2012 г., 03:10
какие's сообщение об ошибке?
 Rudi25 окт. 2012 г., 03:19
@adum Ошибка: Ошибка подтверждения в - [MyDvDsList InsertRecords:], /Users/.../MyDvDsList.m:52 2012-10-25 02: 00: 54.916 MyDvDs [28287: 14003] *** Завершение работы приложения неучтенное исключениеNSInternalInconsistencyException»Причина:Ошибка при создании оператора add. 'недостаточно памяти''
 Rob25 апр. 2016 г., 21:13
Когда вы получитенедостаточно памяти" ошибка, которая на самом деле означает, чтоsqlite3 указатель дляdatabase являетсяNULL (как правило, свидетельствует о невозможности правильно открыть базу данных).

Ответы на вопрос(4)

передайте свой запрос этому методу и попробуйте,

-(void)Insertdata:(NSString*)query{

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

    if(sqlite3_open([databasePath UTF8String],&db) == SQLITE_OK)
    {
        NSString *querySQL = [NSString stringWithFormat: @"%@",query];

        char *errmsg=nil;

        if(sqlite3_exec(db, [querySQL UTF8String], NULL, NULL, &errmsg)==SQLITE_OK)
        {
           NSLog(@".. Row Added ..");
        }
    }
    sqlite3_close(db);
}

Попробуй это:

//save our data
- (BOOL) saveEmployee:(Employee *)employee
{
    BOOL success = false;
    sqlite3_stmt *statement = NULL;
    const char *dbpath = [databasePath UTF8String];

    if (sqlite3_open(dbpath, &mySqliteDB) == SQLITE_OK)
    {
        if (employee.employeeID > 0) {
            NSLog(@"Exitsing data, Update Please");
            NSString *updateSQL = [NSString stringWithFormat:@"UPDATE EMPLOYEES set name = '%@', department = '%@', age = '%@' WHERE id = ?",
                                    employee.name,
                                    employee.department,
                                    [NSString stringWithFormat:@"%d", employee.age]];

            const char *update_stmt = [updateSQL UTF8String];
            sqlite3_prepare_v2(mySqliteDB, update_stmt, -1, &statement, NULL );
            sqlite3_bind_int(statement, 1, employee.employeeID);
            if (sqlite3_step(statement) == SQLITE_DONE)
            {
                success = true;
            }

        }
        else{
            NSLog(@"New data, Insert Please");
            NSString *insertSQL = [NSString stringWithFormat:
                                   @"INSERT INTO EMPLOYEES (name, department, age) VALUES (\"%@\", \"%@\", \"%@\")",
                                   employee.name,
                                   employee.department,
                                   [NSString stringWithFormat:@"%d", employee.age]];

            const char *insert_stmt = [insertSQL UTF8String];
            sqlite3_prepare_v2(mySqliteDB, insert_stmt, -1, &statement, NULL);
            if (sqlite3_step(statement) == SQLITE_DONE)
            {
                success = true;
            }
        }

        sqlite3_finalize(statement);
        sqlite3_close(mySqliteDB);

    }

    return success;
}
Решение Вопроса

хорошо, наконец, я сделал это! это код, который я использовал для всех, кому это нужно:

-(void)InsertRecords:(NSMutableString *)txt{

    NSString *dbPath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"movieData.sqlite"];
    const char *dbpath = [dbPath UTF8String];
    sqlite3 *contactDB;

    sqlite3_stmt    *statement;

    NSLog(@"%@",dbPath);
    if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK)
    {
        NSString *insertSQL = [NSString stringWithFormat: @"INSERT INTO myMovies (movieName) VALUES (\"%@\")", txt];

        const char *insert_stmt = [insertSQL UTF8String];

        sqlite3_prepare_v2(contactDB, insert_stmt, -1, &statement, NULL);
        if (sqlite3_step(statement) == SQLITE_DONE)
        {
            sqlite3_bind_text(statement, 1, [txt UTF8String], -1, SQLITE_TRANSIENT);
        } else {
            NSLog(@"error");
        }
        sqlite3_finalize(statement);
        sqlite3_close(contactDB);
    }
}
 Jacob Barnard10 июн. 2016 г., 01:21
это открыто для атаки инъекцией SQL
 Rob25 апр. 2016 г., 20:48
Это не правильно. Сначала вы вставляете данные в базу данных в комплекте, который доступен только для чтения. Вместо этого используйте папку «Документы». Во-вторых, вы строите SQL, используяstringWithFormat, но если значение содержит кавычку, SQL не будет выполнен. Всегда используйте? заполнители иsqlite3_bind_XXX со строковыми значениями в инструкциях SQL. В-третьих, якак правило, предлагаю войтиsqlite3_errmsg вelse пункт, так что если это не удалось, выузнаю почему. В-четвертых, яНе советую открывать и закрывать базу данных каждый раз. Откройте базу данных при запуске приложения и закройте ее после завершения.

"недостаточно памяти" ошибка из sqlite обычно означает, что дескриптор базы данных, который вы используете hasn 'еще не было открыто. Убедитесь, что вы звонитеsqlite3_open_v2 сdatabase переменная отображается в коде вы разместили?

Ваш ответ на вопрос