2009-09-14 20 views
5

estoy haciendo actualmente los siguientes como parte de mi aplicación para iPhonecomportamiento SQLite en INSERT en el iPhone

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsPath = [paths objectAtIndex:0]; 
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"cities.sqlite"]; 

sqlite3 *database; 

if(sqlite3_open([filePath UTF8String], &database) == SQLITE_OK) { 
    const char *sqlStatement = "insert into table (name, description, image) VALUES (?, ?, ?)"; 
    sqlite3_stmt *compiledStatement; 
    if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) { 
     sqlite3_bind_text(compiledStatement, 1, [name UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(compiledStatement, 2, [description UTF8String], -1, SQLITE_TRANSIENT); 
     NSData *dataForImage = UIImagePNGRepresentation(image); 
     sqlite3_bind_blob(compiledStatement, 3, [dataForImage bytes], [dataForImage length], SQLITE_TRANSIENT); 

    } 
    if(sqlite3_step(compiledStatement) != SQLITE_DONE) { 
     NSLog(@"Error: %s", sqlite3_errmsg(database)); 
    } else { 
     NSLog(@"Insert into row id = %d", sqlite3_last_insert_rowid(database)); 
    } 
    sqlite3_finalize(compiledStatement); 
} 
sqlite3_close(database); 

Lo que me confunde es que si saco la sección,

if(sqlite3_step(compiledStatement) != SQLITE_DONE) { 
     NSLog(@"Error: %s", sqlite3_errmsg(database)); 
    } else { 
     NSLog(@"Insert into row id = %d", sqlite3_last_insert_rowid(database)); 
    } 

la del INSERT no se guarda en la base de datos y se pierde. Supongo que me estoy perdiendo algo obvio aquí?

+0

tengo curiosidad de la razón (s) para no usar la base de datos. – nicerobot

+1

Normalmente uso algunos envoltorios alrededor de SQLite o, la mayoría de las veces, Core Data. Sin embargo, quería saber cómo usar la biblioteca directamente, así que ... –

Respuesta

7

Por supuesto que no quede insertado. Debe llamar al sqlite3_step para ejecutar realmente su extracto.

Verificar the documentation salir.

Es algo de SQLITE, no algo específico de iPhone.

De la documentación:

Después de una declaración preparada ha sido preparado utilizando sqlite3_prepare_v2() o sqlite3_prepare16_v2() o uno de los legado interfaces de sqlite3_prepare() o sqlite3_prepare16(), esta función debe llamarse una o más veces a evaluar la declaración.

+0

La documentación de SQLite no está increíblemente bien diseñada. Gracias por el puntero. –

+0

... pero sí, me faltaba algo obvio. –

2

lo haría totalmente recomendar el uso de un contenedor en lugar de tratar con declaraciones compilación mismo ... Una buena lista de opciones está disponible aquí: http://cocoaheads.byu.edu/resources/sqlite

2

Solo está insertando una fila aquí, por lo que hay un montón de código repetitivo. Pensar en lo que sucedería si se desea introducir varias filas:

  • Usted aún necesita una sola declaración preparar
  • Usted aún necesita un solo estado de finalización
  • Se necesitaría una instrucción paso para cada fila que quieras agregar Puedes pensar en "paso" como "ejecutar" (o "obtener la próxima fila" si estás viendo una instrucción SELECT)

Por cierto, es probable que no quieras "dar un paso" "si la declaración preparada falló".

0

uso del código

const char *sqlStatement = "REPLACE INTO table (name, description, image) VALUES (?, ?, ?)"; 

en lugar de "insertar en"

Cuestiones relacionadas