不能将数据添加到本地DB sqlite IOS
这是我的代码:
为了创build数据库,在我的ViewDidLoad中:
NSString *docsDir; NSArray *dirPaths; dirPaths=NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES); docsDir = [dirPaths objectAtIndex:0]; databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent: @"contacts.db"]]; NSFileManager *filemgr=[NSFileManager defaultManager]; if ([filemgr fileExistsAtPath:databasePath]==NO) { NSLog(@"Creating DB"); const char *dbpath=[databasePath UTF8String]; if (sqlite3_open(dbpath, &contactDB)==SQLITE_OK) { char *error_msg; const char *sql_stmt = "CREATE TABLE IF NOT EXISTS CONTACTS (ID INTEGER PRIMARY KEY AUTOINCREMENT, URL TEXT, EMAIL TEXT, CODE TEXT, FULL TEXT)"; if (sqlite3_exec(contactDB, sql_stmt, NULL, NULL, &error_msg) != SQLITE_OK) { NSLog(@"Failed to create table"); } sqlite3_close(contactDB); } else { NSLog(@"Failed to open/create database"); } } else { NSLog(@"DB exists"); }
我可以看到输出消息"Creating DB"
然后,我必须在那里添加我的数据,我有:
sqlite3_stmt *statement; const char *dbpath = [databasePath UTF8String]; if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK) { NSString *insertSQL = [NSString stringWithFormat: @"INSERT INTO CONTACTS (url, email, code, full) VALUES (\"%@\", \"%@\", \"%@\", \"%@\")", url_2, mail, keycode,full_2 ]; const char *insert_stmt = [insertSQL UTF8String]; sqlite3_prepare_v2(contactDB, insert_stmt, -1, &statement, NULL); if (sqlite3_step(statement) == SQLITE_DONE) { NSLog(@"Contact added"); } else { NSLog(@"Failed to add contact"); } sqlite3_finalize(statement); sqlite3_close(contactDB); } else { NSLog(@"PROBLEM - CONTACT NOT ADDED"); }
我看到了"PROBLEM - CONTACT NOT ADDED"
。
任何帮助?
你犯了一个小错误,如@Rob所示…
代替
dirPaths=NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES);
你应该使用
dirPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
以下是更正后的代码,
NSString *docsDir; NSArray *dirPaths; dirPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); docsDir = [dirPaths objectAtIndex:0]; databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent: @"contacts.db"]]; NSFileManager *filemgr=[NSFileManager defaultManager]; if ([filemgr fileExistsAtPath:databasePath]==NO) { NSLog(@"Creating Database..."); const char *dbpath=[databasePath UTF8String]; if (sqlite3_open(dbpath, &contactDB)==SQLITE_OK) { char *error_msg; const char *sql_stmt = "CREATE TABLE IF NOT EXISTS CONTACTS (ID INTEGER PRIMARY KEY AUTOINCREMENT, URL TEXT, EMAIL TEXT, CODE TEXT, FULL TEXT)"; if (sqlite3_exec(contactDB, sql_stmt, NULL, NULL, &error_msg) != SQLITE_OK) { NSLog(@"Failed to create table"); } sqlite3_close(contactDB); } else { NSLog(@"Failed to open/create database"); } } else { NSLog(@"DB exists"); }
你可以像这样插入数据,
sqlite3_stmt *statement; const char *dbpath = [databasePath UTF8String]; if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK) { NSString *insertSQL = [NSString stringWithFormat: @"INSERT INTO CONTACTS (url, email, code, full) VALUES (\"%@\", \"%@\", \"%@\", \"%@\")", url_2, mail, keycode,full_2 ]; const char *insert_stmt = [insertSQL UTF8String]; sqlite3_prepare_v2(contactDB, insert_stmt, -1, &statement, NULL); if (sqlite3_step(statement) == SQLITE_DONE) { NSLog(@"Contact added"); } else { NSLog(@"Failed to add contact"); } sqlite3_finalize(statement); sqlite3_close(contactDB); } else { NSLog(@"PROBLEM - CONTACT NOT ADDED"); }
谢谢…!!!
问题是你打开你的数据库在NSDocumentationDirectory
,而不是NSDocumentDirectory
。
几个无关的观察:
-
如果
sqlite3_open()
失败,你应该看看数字返回代码,这将有助于你诊断问题的根源。 你可以在sqlite3.h
头文件中查找这些值。 -
一个与你的代码示例无关的观察:你应该检查你的
sqlite3_prepare_v2()
返回代码,因为SQL错误通常在那里被标识,而不是在sqlite3_step()
。 如果返回SQLITE_OK
以外的SQLITE_OK
,则立即调用sqlite3_errmsg()
来确定失败的原因。 -
您不应该使用
stringWithFormat
为INSERT
SQL语句添加值。 反而使用?
占位符,然后使用sqlite3_bind_XXX()
函数将值绑定到这些SQL值。 实际上,如果您插入的任何值包含引号,则SQL将失败(并且容易受到SQL注入攻击)。