【问题标题】:iOS - FMDB database insertiOS - FMDB 数据库插入
【发布时间】:2012-04-23 16:11:05
【问题描述】:

使用 sqlite 将数据插入数据库需要复制数据库以使其可写。所以我在课堂上有这个方法,我在堆栈溢出和许多其他网站上看到的每一个建议:

-(void)createEditableCopyOfDatabaseIfNeeded 
{  
    BOOL success;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"sample.db"];

    success = [fileManager fileExistsAtPath:writableDBPath];

    if (success) return;
    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"sample.db"];
    success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
        if (!success) {
            NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
        }

}

当然,我有以下代码可以访问我的数据库:

FMDatabase *db; = [FMDatabase databaseWithPath:[[NSBundle mainBundle] pathForResource:@"sample" ofType:@"db"]];
if (![db open]) {
    NSLog(@"Error!");
}
else {
    NSLog(@"Database opened!!");
}

[self createEditableCopyOfDatabaseIfNeeded];
[db executeUpdate:@"Insert into user (name, phone, comment) values(?, ?, ?)", @"Name1", @"13548", @"This is a comment", nil];
NSLog(@"Inserted");

FMResultSet *s = [db executeQuery:@"SELECT * FROM user"];
while ([s next]) {
    NSLog(@"%@", [s stringForColumn:@"comment"]);
}

现在,我有几个问题:

  1. 插入代码在执行/运行时在模拟器中完美运行。但是,这对真正的 sample.db 没有影响,我认为它必须在我的 mac 硬盘驱动器的某个地方有一个可写副本。这是可以接受的。但是当我在 iphone 上运行这些代码时,它有点无法识别我的 createEditableCopyOfDatabaseIfNeeded 方法并给出了这个错误:Unknown error finalizing or resetting statement > (8: attempt to write a readonly database)。如何使用 FMDB 使这些代码工作?

  2. 在 iPhone 上运行时,被复制的数据库位于何处?复制后,即使没有连接到我的 Mac,iPhone 是否会再次使用该数据库?

在设备上运行时,我无法插入东西。 请帮忙。

非常感谢!

【问题讨论】:

  • 1.您无法编辑/更新/更改 AppBundle 中的文件,您需要在文档目录中创建数据库。
  • 是的,我建议在 SQLite 中使用 FMDatabase 或 CoreData(事件更好)

标签: iphone ios5 sqlite fmdb


【解决方案1】:

如果您正在阅读本文,那么我对您的问题进行了解释。

  1. 如果 Resource Bundle 中有任何文件,则它是只读文件。因此,您的资源目录的数据库路径仅供阅读。

  2. 根据您为复制数据库而编写的代码,数据库将在您的应用程序的文档目录中创建。即使您从 Mac 中移除 iPhone,此路径也不会受到影响。

【讨论】:

    【解决方案2】:

    试试这个插入数据库

    [db open];
    
    FMResultSet *results = [db executeQueryWithFormat:@"SELECT cms_desc FROM cms_media where cms_name=%@",@"name"];
    
    NSString *str;
    
    while([results next]) 
    
    {
    
        str=[results stringForColumn:@"cms_desc"];
    }
    
    [results close];
    
    [db close];
    

    只需将 .sqlite 文件拖放到您的项目中,然后在设备中重置您的应用程序

    【讨论】:

    • 谢谢,但我的朋友,你太过分了,太过分了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    相关资源
    最近更新 更多