http://www.sqlite.org/rtree.html说,R *树“包括作为合并的一部分,但默认情况下禁用”,并启用Android SQLite R-Tree - 如何安装模块?
嗯,我想用“简单地定义SQLITE_ENABLE_RTREE C-预处理器宏编译” R-树在我的Android应用程序,但显然SQLite是所有预先安装等有没有办法让用户的手机/设备上?
或者,是否可以使用NDK和SQLite免费提供的源代码?
http://www.sqlite.org/rtree.html说,R *树“包括作为合并的一部分,但默认情况下禁用”,并启用Android SQLite R-Tree - 如何安装模块?
嗯,我想用“简单地定义SQLITE_ENABLE_RTREE C-预处理器宏编译” R-树在我的Android应用程序,但显然SQLite是所有预先安装等有没有办法让用户的手机/设备上?
或者,是否可以使用NDK和SQLite免费提供的源代码?
你可以绝对编译自己的SQLite版本。我们这样做是为了从wxSQLite启用加密/编解码器模块。查看Android Git存储库中的SQLite源代码。基本上,它很容易,并创建一个Android.mk与你想要启用的选项(如SQLITE_ENABLE_RTREE)。当然,这会给你一个本地图书馆。为了使用它,您需要从NDK访问它或创建一个包装器(再次,您可以查看Android存储库和Java/JNI包装到SQLite)
这适用于我,从Android中提取。 mk文件。它是用于空间,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给出完全回答你的问题,并包含了一步一步的指导,安装的SQLite与NDK/JNI应用程序。
请注意,您必须在文档中建议的jni/sqlite/Android.mk文件中添加LOCAL_CFLAGS += -DSQLITE_ENABLE_RTREE
,以便在启用R-Tree模块的情况下进行编译。
不要忘记更新导入或使用默认的SQLite数据库。
2017年六月
在的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();
的链接(以上所有):
这是我落得这样做,但它仍然看起来很傻有每个用户的设备 – 2011-06-02 10:41:45
我要问...这里做同样的事情上安装了两次SQlite的。在那里建立了sqlite3本地没有问题。你有任何指向SQLite的JNI包装的链接?我有点希望不必从头开始写封装。 – George 2011-12-14 15:13:58
@George:我们在我们的本地代码中使用SQLite和C++包装器,而不是直接从Java - > JNI,抱歉。 – NuSkooler 2011-12-15 22:06:03