将数据插入 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)在设备上不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

带有 FMDB 包装器的 Sqlite 数据库不插入数据

iOS Swift 插入 sqlite FMDB

使用 FMDB 和 NSDictionary 向 SQLite 数据库添加 NULL 值

iOS 设备上的 SQLCipher + DB 性能较差

FMDB批量插入数据

SQLite 或 FMDB 无法找到包含某些字符的行