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_v2
pragma
誰かが明らかな問題を見つけることができる場合、これが私のコードのスニペットです:
@実装データモデル @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
これに関する提案は大歓迎です!