FMDB -从Cocoa修改DB失败



我正在开发一个Cocoa应用程序,该应用程序与FMDB本地SQLite数据库对话。我遇到了一个问题,我不能在数据库上做任何插入或更新操作。Select查询运行得很好,所以我假设我的数据库连接设置是正确的。

我的代码结构基本上是这样的:
FMDatabase* db=[FMDatabase databaseWithPath:[[NSBundle mainBundle] pathForResource:@"DBName" ofType:@"sqlite"]];
if(![db open])
{
  NSLog(@"Could not open db.");
}
db.traceExecution=YES;
[db beginTransation];
[db ExecuteUpdate:"INSERT INTO test (title) VALUES(?)", [NSNumber numberWithInt]:2],nil];
[db commit];
[db close];

在执行期间没有抛出异常或警告,关于db的控制台输出。traceExecution如下所示:

<FMDatabase: 0x100511fd0> executeUpdate: BEGIN EXCLUSIVE TRANSACTION;
<FMDatabase: 0x100511fd0> executeUpdate: INSERT INTO test (title) VALUES(?);
obj: 2
<FMDatabase: 0x100511fd0> executeUpdate: COMMIT TRANSACTION;

测试数据库只是一个INT类型的单列表。

一切看起来都很好,除了db文件根本没有更新。这对我来说真的很困惑,因为Select查询工作得很好。我检查了数据库的路径,它指向的是正确的。首先,我怀疑这是由文件权限引起的,但是即使我允许每个人都可以读/写,问题仍然是一样的。

我被这个问题困扰了好几个小时,找不到合适的解决方案。有人能解释一下吗?谢谢!

bundle中的数据库是只读的。如果该文件在您定义的目标文件夹中不存在,则应该将其从bundle复制到库或文档文件夹,然后连接到该文件夹。这意味着它会在第一次使用该路径时进行复制。

下面是一个函数,它通过将数据库从bundle复制到目的地来"准备"数据库。它复制到库(从我的iOS应用程序),但你可以复制到任何你想要的地方。在我的例子中,它是contacts.db.

我从ensureOpened调用了这个方法。

- (BOOL)ensureDatabasePrepared: (NSError **)error
{
    // already prepared
    if ((_dbPath != nil) &&
        ([[NSFileManager defaultManager] fileExistsAtPath:_dbPath]))
    {
        return YES;
    }
    // db in main bundle - cant edit.  copy to library if !exist
    NSString *dbTemplatePath = [[NSBundle mainBundle] pathForResource:@"contacts" ofType:@"db"];
    NSLog(@"%@", dbTemplatePath);
    NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
    _dbPath = [libraryPath stringByAppendingPathComponent:@"contacts.db"];
    NSLog(@"dbPath: %@", _dbPath);
    // copy db from template to library
    if (![[NSFileManager defaultManager] fileExistsAtPath:_dbPath])
    {
        NSLog(@"db not exists");
        NSError *error = nil;
        if (![[NSFileManager defaultManager] copyItemAtPath:dbTemplatePath toPath:_dbPath error:&error])
        {
            return NO;
        }
        NSLog(@"copied");
    }    
    return YES;    
}

相关内容

  • 没有找到相关文章

最新更新