0

Django 管理コマンドによって生成された Spatialite データベースがあり、これを iOS アプリに埋め込んでいます。データベースは完全に開きますが、iOS でのデータベースのクエリは、64 ビット デバイスで実行している場合にのみ機能することがわかりました。シミュレートされているかどうかに関係なく、その他のデバイスは、 のSQLITE_NOTADB呼び出しsqlite3_prepare_v2時にエラー メッセージ とともに出力を生成しますfile is encrypted or is not a database

明らかに、このデータベースを作成した Mac は 64 ビット マシンですが、SQLite データベースはビットにとらわれない必要があるため、これがどのように問題になるのかわかりません。おそらく、これは Spatialite データベースには当てはまりませんか? 64 ビット アーチ iOS と同じ方法でファイルを読み取るために、SQLite 関数 (またはコマンド)で使用できるフラグはありますsqlite3_openか? それとも、django からよりプラットフォーム互換性のある形式で Spatialite db を生成する方法があるのでしょうか? ここでの提案は大歓迎です。sqlite3_prepare_v2pragma

誰かが明らかな問題を見つけることができる場合、これが私のコードのスニペットです:

@実装データモデル

@synthesize db;

- (id) 初期化 {
    自己 = [スーパー初期化];
    if (self != nil) {
        Spatialite_init(1);

        sqlite3 *newDbConnection;
        if (sqlite3_open([[self spatialiteDbPath] UTF8String], &newDbConnection) == SQLITE_OK) {
            NSLog(@"データベースが正常に開きました");
            デシベル = newDbConnection;
        } そうしないと {
            NSLog(@"データベースを開く際のエラー");
            デシベル = NULL;
        }

    }

    自分自身を返します。
}

- (NSArray *) getLockupsForRegion: (MKCoordinateRegion) リージョン {

    NSMutableArray *lockups = [[NSMutableArray alloc] init];
    NSString *クエリ = [NSString stringWithFormat:@"\
            名前を選択し、X(場所) を緯度、Y(場所) を経度、\
                   対象、タイプ、容量 \
            FROM lockups_lockup \
            WHERE WITHIN(場所, GeomFromText('POLYGON((%f %f, %f %f, %f %f, %f %f))'));",
                       regionCorners[0].緯度、regionCorners[0].経度、
                       regionCorners[1].緯度、regionCorners[1].経度、
                       regionCorners[2].緯度、regionCorners[2].経度、
                       regionCorners[3].latitude、regionCorners[3].longitude];

    sqlite3_stmt *ステートメント;
    if(デシベル &&
       sqlite3_prepare_v2(db, [クエリ UTF8String], -1, &statement, NULL) == SQLITE_OK) {
        while(sqlite3_step(ステートメント) == SQLITE_ROW) {
            NSLog(@"行");
        }
    } そうしないと {
        NSLog(@"クエリは理由で失敗しました: %s", sqlite3_errmsg(db));
        NSLog(@"SQLite バージョン: %s", sqlite3_version);
    }

    ロックアップを返します。

}

@終わり

アプリを起動し、64 ビット以外の iOS プラットフォームで実行するとgetLockupsForRegion:、ログ出力が生成されます。

SpatiaLite バージョン ..: 4.1.1 サポートされる拡張機能:
    - 'VirtualShape' [シェープファイルへの直接アクセス]
    - 'VirtualDbf' [直接 DBF アクセス]
    - 'VirtualText' [直接 CSV/TXT アクセス]
    - 'VirtualNetwork' [ダイクストラ最短経路]
    - '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' [シェープファイルへの直接アクセス]
    - 'VirtualDbf' [直接 DBF アクセス]
    - 'VirtualText' [直接 CSV/TXT アクセス]
    - 'VirtualNetwork' [ダイクストラ最短経路]
    - '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 アプリ[8548:70b] 行
2013-12-31 01:10:44.913 アプリ[8548:70b] 行
2013-12-31 01:10:44.914 アプリ[8548:70b] 行
2013-12-31 01:10:44.914 アプリ[8548:70b] 行
2013-12-31 01:10:44.915 アプリ[8548:70b] 行
2013-12-31 01:10:44.915 アプリ[8548:70b] 行
2013-12-31 01:10:44.916 アプリ[8548:70b] 行
2013-12-31 01:10:44.916 アプリ[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