2010-08-12 81 views
3

从sqlite3的文档,它看起来像我应该能够使用以下语法在我的iPhone数据库中更新行:sqlite3的更新行语法


NSString *dbFile = [[NSBundle mainBundle] pathForResource:@"database" ofType:@"db"]; 
sqlite3 *database = NULL; 

if (sqlite3_open([dbFile UTF8String], &database) == SQLITE_OK) { 
NSString *sql = [NSString stringWithFormat:@"update mytable set myfirstcolumn=%d, mysecondcolumn=%d where id=%d", int1, int2, int3]; 
sqlite3_exec(database, [sql UTF8String], MyCallback, nil, nil); 
} 

sqlite3_close(database); 

但它不更新数据库或甚至调用回调方法。这只是错误的语法,因为在sqlite3_exec()不能执行更新例如?

在我的例子所有的列名是正确的,3个int值数作为正确的价值观,所以我种的想法......

感谢。

回答

0

sqlite3_exec通常返回一个错误代码(int),而最后一个参数可以是一个指向将设置错误消息的字符串的指针。那些说什么?

sqlite3_exec(database, [sql UTF8String], MyCallback, nil, &errorMsg); 
+0

嗨, 我刚刚检查了错误代码,它返回8(SQLITE3_READONLY),这是我现在探索的一个起点。我没有意识到捆绑包中的文件是只读的。 任何想法在哪里以及如何将数据库文件放在读写区域? – 2010-08-12 15:16:09

+0

也应该有一个单一的数据库实例,说在应用程序委托,所有其他类访问?使用类似上面的代码在不同类的原始消息中访问数据库将不断创建原始数据库的新实例并覆盖任何新的更改,对吧? – 2010-08-12 15:24:25

+1

@Iain Hemstock - 您不需要拥有单个数据库实例,但这样做可能很有意义。通常,每个线程都有一个数据库实例。数据库更改将在应用程序中的所有数据库实例对象之间共享。这是SQLite设计的方式。 – 2010-08-12 15:37:25

2

啊,对,找出了现在可以回答别人的查询的过程。基本上我有资源包中的数据库和我的测试的一些基本数据,我可以读得很好。但是因为bundle资源是只读的,所以我无法将数据写回数据库。

因此,解决方案是将数据库以编程方式复制到应用程序启动时的应用程序的Documents文件夹中,但使用代码来查看数据库是否已经存在(为了不覆盖它)。因为这个文件夹是读写的,所以在更新数据库时应该没有问题。