我们遇到的问题似乎只出现在 iOS 设备上,但在模拟器上似乎运行良好。这就是问题所在...
- 我们的 iOS 应用程序是 Hybrid (Cordova),其中一些视图完全是原生的,而另一些则完全是 Web 的。
- 我们想在两个代码库中使用相同的 sqlite db。
- 在 Web 中,我们使用 WebSQL api(不是 Cordova 插件),在本机 iOS 端,我们使用 FMDB。
- 该数据库最初是从 javascript 创建的,并放置在 App 的 Library Directory 中
- 4.x 目录
<AppDir>/Library/WebKit/Databases/file__0/0000000000000001.db
- 5.x 目录
<AppDir>/Library/Caches/file__0/0000000000000001.db
- 4.x 目录
- 每当 FMDB 访问 sqlite 数据库时,JS 代码就不能再针对它创建的数据库运行事务。
虽然还有其他类似的 SO 问题,但我还没有看到 Web 和本地都可以访问数据库的问题。根据我到目前为止所做的研究,这似乎是一个仅出现在设备上的沙盒问题。这是我们用来打开数据库的代码。
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));
}
注意这段代码运行后,后续JS端调用数据库会报如下错误:“unable to open a transaction to the database”