SQLite iOS Insertar datos

Estoy tratando de insertar un nombre para mi sqlite archivo. estoy usando este código pero no funciona :/

-(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);
}
  • ¿cuál es el mensaje de error?
  • El error es : error de Aserción en -[MyDvDsList InsertRecords:], /Users/…/MyDvDsList.m:52 2012-10-25 02:00:54.916 MyDvDs[28287:14003] *** Terminación de la aplicación debido a uncaught exception ‘NSInternalInconsistencyException’, la razón: «Error al crear agregar declaración. «de la memoria»
  • Cuando usted consigue la «memoria» de error, que confusamente en realidad significa que el sqlite3 puntero para el database es NULL (generalmente sintomático de la falta de adecuada abrir la base de datos).
InformationsquelleAutor Rudi | 2012-10-25

4 Kommentare

  1. 2

    paso tu consulta a este método y probar,

    -(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);
    }
  2. 1

    Un «out of memory» error de sqlite normalmente significa que el identificador de base de datos que está utilizando no se ha abierto aún. Asegúrese de que usted está llamando sqlite3_open_v2 con el database variable se muestra en el código que has publicado?

  3. 1

    aceptar finalmente lo hice ! este es el código que he usado para todo el que lo necesite :

    -(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);
        }
    }
    • Esto no es correcto. En primer lugar, se va a insertar datos en la base de datos en el paquete, que es de sólo lectura. El uso de la carpeta de Documentos en su lugar. En segundo lugar, la construcción de SQL utilizando stringWithFormat, pero si el valor contiene un signo de comillas, el SQL fallará. Utilice siempre ? marcadores de posición y sqlite3_bind_XXX con los valores de cadena en las sentencias SQL. Tercero, me gustaría sugieren por lo general el registro de sqlite3_errmsg en el else cláusula, de modo que si no, usted sabrá por qué. En cuarto lugar, me gustaría aconsejar en contra de la apertura y el cierre de la base de datos cada vez. Abra la base de datos cuando la aplicación se inicia, y cerca de ella al momento de la terminación.
    • esto está abierto a ataques de inyección SQL
  4. 1

    Intente esto:

    //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;
    }

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...