Estoy tratando de crear un archivo de base de datos SQLite3 a través de Objective-C en tiempo de ejecución. Estoy tratando de crear una tabla llamada "tblStore". Quiero que los nombres de campo se llamen "strStoreNumber" y "strStoreReg". Soy nuevo en iOS y SQLite, así que estoy teniendo dificultades para encontrar la sintaxis para realizar esto. Además de crear la tabla, quiero que la tabla creada resida NO en el paquete de la aplicación, sino que residirá/estará almacenada en algún lugar del teléfono. La tabla debe ser legible/grabable. He leído algo sobre "user sandbox" y también un "directorio de documentos". No estoy seguro de entender la diferencia entre los dos. Idealmente, mi aplicación usaría un botón para recibir información de los campos de texto. Después de que la entrada de los campos de texto se ponga en cadenas, se verificará si mi tabla SQLite "tblStore" existe, y si no, se creará la tabla.Creación de un archivo de base de datos SQLite3 a través de Objective-C
Recapitulación: 1. ¿Cuál es la sintaxis para Obj-C/SQLite para crear una tabla llamada "tblStore" con los campos "strStoreNumber" y "strStoreReg"? 2. ¿Dónde debe residir el archivo db? Necesito leer y escribir en el archivo tblStore db. 3. ¿Cuál es la diferencia entre un "sandbox de usuario" y un "directorio de documentos"?
Esto es lo que tengo actualmente:
-(IBAction)setInput:(id)sender
{
NSString *strStoreNumber;
NSString *strRegNumber;
NSString *tableName = @"tblStore";
NSString *dbStrStore = @"strStore";
NSString *dbStrReg = @"strReg";
strStoreNumber = StoreNumber.text;
strRegNumber = RegNumber.text;
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* documentsDirectory = [paths lastObject];
NSString* databasePath = [documentsDirectory stringByAppendingPathComponent:@"tblStore.sqlite"];
// NSString* databasePath = [[NSBundle mainBundle] pathForResource:@"tblStore" ofType:@"sqlite"];
if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)
{
NSLog(@"Opened sqlite database at %@", databasePath);
char *err;
NSString *sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS '%@' ('%@' TEXT PRIMARY KEY, '%@' TEXT);", tableName, dbStrStore, dbStrReg];
if (sqlite3_exec(database, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK)
{
sqlite3_close(database);
NSAssert(0, @"Table failed to create.");
}
//...stuff
}
else
{
NSLog(@"Failed to open database at %@ with error %s", databasePath, sqlite3_errmsg(database));
sqlite3_close (database);
}
NSString *querystring;
// create your statement
querystring = [NSString stringWithFormat:@"SELECT strStore, strReg FROM tblStore WHERE strStore = %@ AND strReg = %@;", strStoreNumber, strRegNumber];
const char *sql = [querystring UTF8String];
NSString *szStore = nil;
NSString *szReg = nil;
sqlite3_stmt *statement = nil;
if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL)!=SQLITE_OK) //queryString = Statement
{
NSLog(@"sql problem occured with: %s", sql);
NSLog(@"%s", sqlite3_errmsg(database));
}
else
{
// you could handle multiple rows here
while (sqlite3_step(statement) == SQLITE_ROW)
{
szStore = [NSString stringWithUTF8String:(char*)sqlite3_column_text(statement, 0)];
szReg = [NSString stringWithUTF8String:(char*)sqlite3_column_text(statement, 1)];
}
}
sqlite3_finalize(statement);
lblStoreNumber.text = szStore;
lblRegNumber.text = szReg;
}
Cuando ejecuto mi aplicación, consigo los siguientes errores:
2012-05-10 14:58:38.169 CCoDBTry[355:f803] Opened sqlite database at /Users/Matt****/Library/Application Support/iPhone Simulator/5.1/Applications/5DB7A218-A0F6- 485F-B366-91FD2F9BC062/Documents/tblStore.sqlite
2012-05-10 14:58:38.307 CCoDBTry[355:f803] sql problem occured with: SELECT strStore, strReg FROM tblStore WHERE strStore = 8053 AND strReg = 4;
2012-05-10 14:58:38.308 CCoDBTry[355:f803] no such column: strStore
aprecio cualquiera que se tome el tiempo para explicar parte de esta cosas, ya que soy muy nuevo y no he tenido éxito en lograr algunas de las cosas que he intentado. ¡Muchísimas gracias por la ayuda!
Esto fue realmente útil, pero esperaba evitar cualquier tipo de envoltorios o bibliotecas externas. Voy a esperar otras respuestas para ver si alguien podría proporcionar alguna información sobre cómo sería la sintaxis de creación de tabla pura. Todo lo que estoy pasando en mi aplicación no está yendo bien, jaja. ¡Gracias por la respuesta rápida! – Skizz
, así es su decisión ... pero tenga en cuenta que al usar los envoltorios solo tendrá que usar llamadas objetivas c ... como [self getRow: 2]. Es MUCHO más fácil que pasar por todas las llamadas sql: abra db, haga una declaración, ejecute la instrucción, luego vea si no es nula, maneje el error, procese los datos, y luego cierre. Eso es un dolor solo por escribir. – skytz