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

Rya*_*fer 6 javascript sqlite ios cordova-2.0.0

我们遇到的问题似乎只出现在iOS设备上,但似乎在模拟器上运行良好.这是问题......

  • 我们的iOS应用程序是Hybrid(Cordova),其中一些视图完全是原生的,而另一些则完全是Web.
  • 我们想从两个代码库中使用相同的sqlite db.
  • 在网络中我们使用的是WebSQL api(不是cordova插件),从Native iOS端我们使用的是FMDB.
  • 该数据库最初是从javascript创建的,并放置在App的Library Directory中
    • 4.x Dir <AppDir>/Library/WebKit/Databases/file__0/0000000000000001.db
    • 5.x Dir <AppDir>/Library/Caches/file__0/0000000000000001.db
  • 每当FMDB访问sqlite数据库时,JS代码就不能再对它创建的数据库运行事务.

虽然还有其他类似的SO问题,但我还没有看到网络和原生访问数据库的地方.根据我迄今为止所做的研究,似乎这是一个只出现在设备上的沙盒问题.这是我们用来打开数据库的代码.

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));
}
Run Code Online (Sandbox Code Playgroud)

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

Rya*_*fer 0

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