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