Ios 无法使用FMDB包装在SQLITE数据库中插入

Ios 无法使用FMDB包装在SQLITE数据库中插入,ios,sqlite,fmdb,Ios,Sqlite,Fmdb,我是IOS开发的新手,所以我关注这一点 正如本教程中提到的,我使用SQLITE命令行创建了数据库,创建了表,然后通过将数据库添加到Supporting Files文件夹,将其导入到XCode 4.6项目中 我只想用数据填充该表,这样我就有了一个函数,可以首先找到我的数据库并将其复制到Documents文件夹(如果不存在,则已经存在): 当writebleDBPath指向Customers.db所在的实际路径(在项目的Documents文件夹中)时,这种方法可以正常工作 现在,我打开数据库并尝试

我是IOS开发的新手,所以我关注这一点

正如本教程中提到的,我使用SQLITE命令行创建了数据库,创建了表,然后通过将数据库添加到Supporting Files文件夹,将其导入到XCode 4.6项目中

我只想用数据填充该表,这样我就有了一个函数,可以首先找到我的数据库并将其复制到Documents文件夹(如果不存在,则已经存在):

当writebleDBPath指向Customers.db所在的实际路径(在项目的Documents文件夹中)时,这种方法可以正常工作

现在,我打开数据库并尝试添加新记录:

[db open];
BOOL success =  [db executeUpdate:@"INSERT INTO customers (firstname,lastname) VALUES (?,?);",[patient.firstName UTF8String],[patient.secondName UTF8String], nil];

[db close];
但成功的价值总是“不”

我包括用于创建sqlite数据库的代码:

CREATE TABLE customers(id integer primary key, firstname varchar(30), lastname varchar(30))

我错过了什么

如果
id
是主键,可能您也需要设置它


尝试调用
[db lastErrorMessage]
查看问题所在。

您在教程中遗漏了一个步骤:

NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:self.databaseName];
[fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];

它从捆绑包中复制数据库文件。这假设您创建了数据库及其架构,并将其包含在应用程序包中。

谢谢,这是真的。在写入数据库之前,我设法调用了一个函数,该函数检查数据库是否已复制到documents文件夹中,否则它会使用刚才描述的copyItemAtPath方法立即复制它。而且它有效!现在,我想知道这是否是持久性的,我的意思是我必须执行额外的操作才能使更改在设备上持久化吗?我发现,如果我重新运行模拟器——在运行一次应用程序并插入数据库并关闭模拟器之后——应用程序将使用数据库的新副本运行——如果文件不存在,则只需执行此步骤。因此,在再次复制之前,请将上述内容包装在一个电话中,以检查文件。谢谢Richard,我刚刚这么做了,它工作正常。然而,我还有一个问题,我已经完成了:我是否需要更多的东西来使更改(插入到表中)持久化?我的意思是,我在模拟器中运行应用程序,我可以在表中插入任意次数,我检查项目是否正确插入。一切似乎都很好。然后,我停止运行(从XCode停止按钮)并重新运行/重建应用程序,该应用程序与以前一样在同一个模拟器中打开,但现在数据库的副本为空。为什么我看不到我在第一次运行时所做的插入?请尝试www.github.com/pmurphyjam/DBExample这是一个使用Sqlite的Xcode项目。SQL语法与FMDB相同。它还可以执行大型SQL事务。
NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:self.databaseName];
[fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];