Criando um arquivo de banco de dados SQLite3 através do Objective-C
Eu estou tentando criar um arquivo de banco de dados SQLite3 através de Objective-C em tempo de execução. Eu estou tentando criar uma tabela chamada "tblStore". Eu quero que os nomes de campo sejam chamados de "strStoreNumber" e "strStoreReg". Sou novo no iOS e no SQLite, por isso estou tendo dificuldade em encontrar a sintaxe para executar isso. Além de criar a tabela, quero que a tabela criada não esteja no pacote do aplicativo, mas sim que ela seja armazenada em algum lugar no telefone. A tabela precisa ser legível / gravável. Eu fiz algumas leituras em "sandbox de usuário" e também um "diretório de documentos". Não tenho certeza se entendi a diferença entre os dois. Idealmente, meu aplicativo usaria um botão para receber informações de campos de texto. Depois que a entrada dos campos de texto é colocada em strings, uma verificação seria feita para ver se minha tabela SQLite "tblStore" existe e, se não, a tabela será criada.
Para recapitular: 1. Qual é a sintaxe para Obj-C / SQLite para criar uma tabela chamada "tblStore" com os campos "strStoreNumber" e "strStoreReg"? 2. Onde o arquivo db deve residir? Eu preciso ler e gravar no arquivo db tblStore. 3. Qual é a diferença entre uma "sandbox de usuário" e um "diretório de documentos"?
Isto é o que tenho atualmente:
<code>-(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; } </code>
Quando executo meu aplicativo, recebo os seguintes erros:
<code>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 </code>
Eu agradeço qualquer um que aproveite o tempo para explicar algumas dessas coisas, já que sou muito novo e não consegui realizar algumas das coisas que tentei. Muito obrigado pela ajuda!