将数据插入 SQLite(使用 FMDB)在设备上不起作用?
Posted
技术标签:
【中文标题】将数据插入 SQLite(使用 FMDB)在设备上不起作用?【英文标题】:Inserting a data into SQLite (using FMDB) doesn't work on device? 【发布时间】:2012-08-06 07:21:33 【问题描述】:我是这里的新手。在我的设备上运行时,我无法将任何数据插入我的 SQLite 数据库。我正在使用下面的代码来连接 SQLite。它在我的模拟器中完美运行,但不适用于我的 iPad 设备。有人可以帮忙吗?谢谢你。
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"DADatabase1.sqlite"];
NSLog(@"%@", writableDBPath);
FMDatabase* db = [FMDatabase databaseWithPath:writableDBPath];
/*if ([fileManager fileExistsAtPath:writableDBPath] == NO)
NSString *resourcePath = [[NSBundle mainBundle] pathForResource:@"DADatabase1.sqlite" ofType:@"sqlite"];
[fileManager copyItemAtPath:resourcePath toPath:writableDBPath error:nil];
*/
[db open];
[db traceExecution];
[db beginTransaction];
BOOL success = [db executeUpdate:[NSString stringWithFormat:@"insert into PatientDetails (patAge) values (?)",patAge.text]];
if(!success)
NSLog(@"Query not success!");
else
NSLog(@"Query success!");
//NSString *query = [NSString stringWithFormat:];
[db commit];
[db close];
【问题讨论】:
你也得换?通过 %@ 因为 ?用于准备好的语句 好的,但它确实在模拟器上完美运行。那么,您认为这会导致问题吗?谢谢 您的患者年龄应该是“?”在您的数据库中 【参考方案1】:您是否将您的Database
和您的Tables
放在您的项目资源文件夹中?您必须将数据库文件复制到您的 Apps Document
文件夹中。
+ (BOOL)initDB
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"sqlite.db"];
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath: path])
NSString *bundle = [[ NSBundle mainBundle] pathForResource:@"sqlite" ofType:@"db"];
[fileManager copyItemAtPath:bundle toPath:path error:nil];
return YES;
return NO;
【讨论】:
100 2012-08-06 13:10:31.806 Pro_sample[317:707] 局部麻醉 2012-08-06 13:10:36.751 Pro_sample[317:707] 样本数组计数:1 2012-08-06 13:10:36.758 Pro_sample[317:707] /var/mobile/Applications/453590BF-DCA9-4768-BDBA-75E1087E6CE8/Documents/DADatabase1.sqlite 2012-08-06 13:10:36.765 Pro_sample[ 317:707] 查询不成功! 我将数据库文件手动添加到 Documents 文件夹中。我必须以编程方式做任何事情吗? 是的,您必须使用我的代码以编程方式执行此操作,因为您的模拟器文档文件夹中的文件不会被复制到您的设备中 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"DADatabase1.sqlite"]; NSFileManager *fileManager = [NSFileManager defaultManager]; NSLog(@"%@", writableDBPath); 在将 DB 文件复制到 Documents 文件夹后完美运行。非常感谢您的帮助。【参考方案2】:提供的示例代码没有CREATE TABLE
语句。 INSERT
无处可插入。您在模拟器中开发时是否手动创建了表(使用sqlite3
命令行工具)?
【讨论】:
我实际上是使用 SQLite 管理器(Firefox 插件)创建的。它在模拟器中运行良好。我不明白为什么它在设备上什么都不做。我是否遗漏了数据库文件路径规范方面的任何内容? 我不熟悉 Firefox 插件,但大概在某些步骤中您指定了 PatientDetails 表应该存在以及它应该包含哪些列?查看您的代码,预计数据库位于 Documents 文件夹中,这很好且正确。但是该文件夹及其内容并没有(据我了解)复制到真实设备。您的代码需要为自己创建表。为避免需要检查首次运行,您只需使用CREATE TABLE IF NOT EXISTS ...
,就会发生正确的事情。【参考方案3】:
注意:
模拟器中的文件名不区分大小写,但设备中的文件名区分大小写。确保您的文件名完全相同。
【讨论】:
以上是关于将数据插入 SQLite(使用 FMDB)在设备上不起作用?的主要内容,如果未能解决你的问题,请参考以下文章