我有一个由 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
对此的任何建议将不胜感激!