http://www.sqlite.org/rtree.html说 r*tree “包含在合并中,但默认情况下被禁用”并启用它“只需使用定义的 SQLITE_ENABLE_RTREE C 预处理器宏进行编译”
好吧,我想在我的 android 应用程序中使用 R-trees,但显然 SQLite 已全部预装等。有没有办法在用户的手机/设备上启用它?
或者,是否可以使用 NDK 和免费提供的 SQLite 源代码?
http://www.sqlite.org/rtree.html说 r*tree “包含在合并中,但默认情况下被禁用”并启用它“只需使用定义的 SQLITE_ENABLE_RTREE C 预处理器宏进行编译”
好吧,我想在我的 android 应用程序中使用 R-trees,但显然 SQLite 已全部预装等。有没有办法在用户的手机/设备上启用它?
或者,是否可以使用 NDK 和免费提供的 SQLite 源代码?
2017 年 6 月
在 onCreate 中,您可以使用内存数据库进行快速测试:
System.loadLibrary("sqliteX");
// get the SQLite version
String query = "select sqlite_version() AS sqlite_version";
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(":memory:", null);
Cursor cursor = db.rawQuery(query, null);
String sqliteVersion = "";
if (cursor.moveToNext()) {
sqliteVersion = cursor.getString(0);
}
// do some R*Tree things (this will fail for the standard SQLite)
db.execSQL("CREATE VIRTUAL TABLE demo_index USING rtree(id, minX, maxX, minY, maxY);");
db.execSQL("INSERT INTO demo_index VALUES(1,-80.7749, -80.7747, 35.3776, 35.3778);");
db.execSQL("INSERT INTO demo_index VALUES(2,-81.0, -79.6, 35.0, 36.2);");
cursor = db.rawQuery("SELECT id FROM demo_index WHERE minX>=-81.08 AND maxX<=-80.58 AND minY>=35.00 AND maxY<=35.44;", null);
int id = -1;
if (cursor.moveToFirst()) {
do {
id = cursor.getInt(0);
} while (cursor.moveToNext());
}
db.close();
链接(以上所有):
你完全可以编译你自己的 SQLite 版本。我们这样做是为了从 wxSQLite 启用加密/编解码器模块。查看 Android Git 存储库中的 SQLite 源代码。基本上,它很容易创建一个带有您想要启用的选项(例如 SQLITE_ENABLE_RTREE)的 Android.mk。当然,这会给你一个原生库。为了使用它,您需要从 NDK 访问它或创建一个包装器(同样,您可以查看 Android 存储库和 Java/JNI 包装器到 SQLite)
这对我有用,从 Android.mk 文件中提取。它是针对spatialite、sqlite的空间扩展。
include $(CLEAR_VARS)
# -DOMIT_GEOS=0
# ./configure --build=x86_64-pc-linux-gnu --host=arm-linux-eabi
LOCAL_MODULE := spatialite
LOCAL_CFLAGS := -D__ANDROID__ -Dfdatasync=fsync -DOMIT_GEOCALLBACKS -DSQLITE_ENABLE_RTREE
LOCAL_LDLIBS := -llog
LOCAL_C_INCLUDES := \
libiconv-1.13.1/include \
libiconv-1.13.1/libcharset/include \
geos-3.2.2/source/headers \
geos-3.2.2/capi \
proj-4.6.1/src
LOCAL_SRC_FILES := \
./libspatialite-amalgamation-2.4.0/spatialite.c \
./libspatialite-amalgamation-2.4.0/empty.cpp \
./libspatialite-amalgamation-2.4.0/sqlite3.c
LOCAL_STATIC_LIBRARIES := iconv proj geos
include $(BUILD_STATIC_LIBRARY)
https://www.sqlite.org/android/doc/trunk/www/index.wiki准确地回答了您的问题,并包含使用 NDK/JNI 为您的应用程序安装 SQLite 的分步指南。
请注意,您必须LOCAL_CFLAGS += -DSQLITE_ENABLE_RTREE
按照文档的建议添加 jni/sqlite/Android.mk 文件,以便在启用 R-Tree 模块的情况下进行编译。
不要忘记更新您的导入,否则将使用默认的 SQLite 数据库。