iOS-从JavaScript和FMDB访问单个sqlite数据库

iOS-从JavaScript和FMDB访问单个sqlite数据库,javascript,ios,sqlite,cordova-2.0.0,Javascript,Ios,Sqlite,Cordova 2.0.0,我们遇到了一个问题,这个问题似乎只出现在iOS设备上,但在模拟器上似乎可以正常工作。问题是 我们的iOS应用程序是混合的(Cordova),有些视图完全是本地视图,有些视图完全是web视图 我们希望从两个代码库中使用相同的sqlite db 在web中,我们使用WebSQL api(不是cordova插件),从本机iOS端,我们使用FMDB 数据库最初由javascript创建,并放置在应用程序的库目录中 4.x目录/Library/WebKit/Databases/file\u 0/000

我们遇到了一个问题,这个问题似乎只出现在iOS设备上,但在模拟器上似乎可以正常工作。问题是

  • 我们的iOS应用程序是混合的(Cordova),有些视图完全是本地视图,有些视图完全是web视图
  • 我们希望从两个代码库中使用相同的sqlite db
  • 在web中,我们使用WebSQL api(不是cordova插件),从本机iOS端,我们使用FMDB
  • 数据库最初由javascript创建,并放置在应用程序的库目录中
    • 4.x目录
      /Library/WebKit/Databases/file\u 0/000000000000000 1.db
    • 5.x目录/code>/Library/Caches/file\u 0/000000000000000 1.db
  • 每当FMDB访问sqlite数据库时,JS代码就不能再对其创建的数据库运行事务
虽然还有其他类似的SO问题,我还没有看到一个DB可以通过web和本机访问的问题。根据我到目前为止所做的研究,这似乎是一个沙箱问题,只出现在设备上。下面是我们用来打开数据库的代码。

请注意,此代码运行后,JS端对数据库的后续调用会导致以下错误:
“无法打开到数据库的事务”

我们可以通过将sqlite数据库上的迁移一直回滚到第一次迁移之前,从而获得所需的结果,有效地为我们提供了一个干净的数据库。我们也没有删除由web视图创建的任何缓存文件。这不是世界上最好的解决方案,但它似乎适用于我们的用例。如果还有其他答案,我很想多听听。

您是否尝试过使用文档目录而不是库目录?您是否在尝试从JS端连接之前关闭与FMDB的连接?
NSArray  *libraryPaths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,
                                                             NSUserDomainMask,
                                                             YES);
NSString *libraryDir   = [libraryPaths objectAtIndex:0];
NSString *databasePath = [libraryDir
                          stringByAppendingPathComponent:@"WebKit/Databases/file__0/"];

NSFileManager *fileManager = [NSFileManager defaultManager];

if (![fileManager fileExistsAtPath:databasePath]) {
    databasePath = [libraryDir
                    stringByAppendingPathComponent:@"Caches/file__0/"];
}

NSString *databaseFile = [databasePath
                          stringByAppendingPathComponent:@"0000000000000001.db"];

if (!static_fmdb) {
    static_fmdb = [FMDatabase databaseWithPath:databaseFile];
    NSAssert(static_fmdb, @"Unable to open create FMDatabase");
}
if (![static_fmdb open]) {
    NSLog(@"Error in %@: Failed to connect to database!\n",
          NSStringFromSelector(_cmd));
}