我有一个由 Django 管理命令生成的 Spatialite 数据库,我将其嵌入到 iOS 应用程序中。数据库完美打开,但我发现只有在 64 位设备上运行时,才能在 iOS 上查询数据库。任何其他设备,无论是模拟的还是其他的,都会SQLITE_NOTADB
在调用时产生输出,并sqlite3_prepare_v2
带有错误消息file is encrypted or is not a database
。
显然,生成此数据库的 Mac 是 64 位机器,但 SQLite 数据库应该与位无关,所以我不认为这应该是个问题。也许这不适用于 Spatialite 数据库?sqlite3_open
是否有任何标志可以与任何 SQLite 函数(可能sqlite3_prepare_v2
是pragma
命令)一起使用,以使其以与 64 位拱 iOS 相同的方式读取文件?或者也许有一种方法可以从 django 以更平台兼容的格式生成 Spatialite db?欢迎在这里提出任何建议。
这是我的代码片段,如果有人能发现任何明显的问题:
@implementation 数据模型 @synthesize 数据库; - (id) 初始化 { self = [超级初始化]; 如果(自我!=零){ 空间初始化(1); sqlite3 *newDbConnection; if (sqlite3_open([[self spatialiteDbPath] UTF8String], &newDbConnection) == SQLITE_OK) { NSLog(@"数据库打开成功"); db = newDbConnection; } 别的 { NSLog(@"打开数据库出错"); 分贝=空; } } 回归自我; } - (NSArray *) getLockupsForRegion: (MKCoordinateRegion) 区域 { NSMutableArray *lockups = [[NSMutableArray alloc] init]; NSString *query = [NSString stringWithFormat:@"\ 选择名称,X(位置)作为纬度,Y(位置)作为经度,\ 覆盖,类型,容量\ 从 lockups_lockup \ WHERE WITHIN(location, GeomFromText('POLYGON((%f %f, %f %f, %f %f, %f %f))'));", regionCorners[0].latitude, regionCorners[0].longitude, regionCorners[1].latitude, regionCorners[1].longitude, regionCorners[2].latitude, regionCorners[2].longitude, regionCorners[3].latitude, regionCorners[3].longitude]; sqlite3_stmt *语句; 如果(分贝 && sqlite3_prepare_v2(db, [查询 UTF8String], -1, &statement, NULL) == SQLITE_OK) { 而(sqlite3_step(语句)== SQLITE_ROW){ NSLog(@"一行"); } } 别的 { NSLog(@"查询失败原因:%s", sqlite3_errmsg(db)); NSLog(@"Sqlite 版本:%s", sqlite3_version); } 返回锁定; } @结尾
启动应用程序并在非 64 位 iOS 平台上运行getLockupsForRegion:
会产生日志输出:
SpatiaLite 版本 ..:4.1.1 支持的扩展: - 'VirtualShape' [直接 Shapefile 访问] - 'VirtualDbf' [直接 DBF 访问] - 'VirtualText' [直接 CSV/TXT 访问] - 'VirtualNetwork' [Dijkstra 最短路径] - 'RTree' [空间索引 - R*Tree] - 'MbrCache' [空间索引 - MBR 缓存] - 'VirtualSpatialIndex' [R*Tree 元处理程序] - 'VirtualFDO' [FDO-OGR 互操作性] - 'SpatiaLite' [空间 SQL - OGC] PROJ.4版本......:Rel。4.8.0,2012 年 3 月 6 日 GEOS版本............:3.4.2-CAPI-1.8.2 r3921 2013-12-31 00:29:39.567 App[8320:70b] 数据库打开成功 2013-12-31 00:29:48.128 App[8320:70b] 查询失败原因:文件已加密或不是数据库 2013-12-31 00:29:48.710 应用程序[8320:70b] Sqlite 版本:3.8.1
以及arm64下的日志输出:
SpatiaLite 版本 ..:4.1.1 支持的扩展: - 'VirtualShape' [直接 Shapefile 访问] - 'VirtualDbf' [直接 DBF 访问] - 'VirtualText' [直接 CSV/TXT 访问] - 'VirtualNetwork' [Dijkstra 最短路径] - 'RTree' [空间索引 - R*Tree] - 'MbrCache' [空间索引 - MBR 缓存] - 'VirtualSpatialIndex' [R*Tree 元处理程序] - 'VirtualFDO' [FDO-OGR 互操作性] - 'SpatiaLite' [空间 SQL - OGC] PROJ.4版本......:Rel。4.8.0,2012 年 3 月 6 日 GEOS版本............:3.4.2-CAPI-1.8.2 r3921 2013-12-31 01:10:34.491 App[8548:70b] 数据库打开成功 2013-12-31 01:10:44.913 App[8548:70b] 一行 2013-12-31 01:10:44.913 App[8548:70b] 一行 2013-12-31 01:10:44.914 App[8548:70b] 一行 2013-12-31 01:10:44.914 App[8548:70b] 一行 2013-12-31 01:10:44.915 App[8548:70b] 一行 2013-12-31 01:10:44.915 App[8548:70b] 一行 2013-12-31 01:10:44.916 App[8548:70b] 一行 2013-12-31 01:10:44.916 App[8548:70b] 一行
版本:
- 蟒蛇:2.7.5
- 姜戈:1.6
- PySqlite:2.6.3
- Sqlite(在机器上生成 Spatialite db):3.8.1
- Spatialite(在机器上生成 Spatialite db):4.1.1
- Sqlite(在 iOS 上):3.8.1
- Spatialite(在 iOS 上):4.1.1
对此的任何建议将不胜感激!