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
これに関する提案は大歓迎です!