0

我有一个由 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_v2pragma命令)一起使用,以使其以与 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

对此的任何建议将不胜感激!

4

0 回答 0