【发布时间】:2014-04-20 11:13:08
【问题描述】:
我有一个问题困扰了我好几天。我要做的就是在方法'ViewDidLoad'中添加一个命令,这将使将数据输入sqlite,这将使它变得简单,不需要其他字段和按钮,因此,在模拟运行时,新记录将自动插入在 sqlite 中,所以我试试这个:
- 在 SQLite Manager 数据库(firefox 中的插件)中,我创建了一个名为“registros”的新数据库,程序将其保存为“registros.sqlite”
-
我创建了这张表:
CREATE TABLE "main"."campos" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE , "campo1" VARCHAR, "campo2" VARCHAR, "campo3" VARCHAR)
在我的项目文件中,我所做的只是使用 xib 文件创建一个名为“MYFristViewController”的文件,在“构建阶段”中添加“libsqlite3.dylib”。在 MyFristViewController.m 中添加以下代码:
#import "MyFristViewController.h"
#import <sqlite3.h>
@implementation MyFristViewController
- (void)viewDidLoad{
[super viewDidLoad];
sqlite3 *db;
NSString *dbPath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"registros.sqlite"];
sqlite3_open([dbPath UTF8String], &db);
char *sql = "INSERT INTO campos (campo1,campo2,campo3) VALUES (?,?,?)";
sqlite3_stmt *stmt;
int resultado2 = sqlite3_prepare_v2(db, sql, -1, &stmt, nil);
sqlite3_bind_text(stmt, 1, [@"Campo_01" UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(stmt, 2, [@"Campo_02" UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(stmt, 3, [@"Campo_03" UTF8String], -1, SQLITE_TRANSIENT);
resultado2 = sqlite3_step(stmt);
sqlite3_finalize(stmt);
}
@end
作为一个初学者我不知道还能做什么,我什至尝试将命令'sqlite3_bind_text'的第五个参数修改为SQLITE_STATIC或SQLITE_TRANSIENT,但似乎没有将值添加到数据库中,可以有人帮我吗?
【问题讨论】:
-
您需要检查
sqlite3_open、sqlite3_prepare_v2和sqlite3_step的返回值。此外,最好使用sqlite3_open_v2而不是旧的sqlite3_open。此外,应用程序的捆绑包是只读的。你不能在那里写文件,所以你需要在你的应用程序第一次运行时把你的数据库文件放在一个可写的位置。 -
如果返回代码之一不是“好”,则记录
sqlite3_errmsg()的值。 SQLite 中的错误报告非常好,但您必须实际使用它。 -
一般CREATE TABLE应该是
CREATE TABLE IF NOT EXIST,这样你第二次访问数据库就不会出错了。 -
另外,要了解如何使用 SQLite 并测试您的查询,请在命令窗口中使用
sqlite3OSX 命令来打开和操作测试文件。该命令还可用于检查您在模拟器中创建的 DB 文件的内容。
标签: ios objective-c sqlite