问题
http://www.sqlite.org/rtree.html says that the r*tree is "included as part of the amalgamation but is disabled by default" and to enable it "simply compile with the SQLITE_ENABLE_RTREE C-preprocessor macro defined"
Well I want to use R-trees in my android app, but clearly SQLite is all pre-installed etc. Is there a way to enable it on a user's phone/device?
Alternatively, is it possible to use the NDK and the freely available source code for SQLite?
回答1:
You can absolutely compile your own version of SQLite. We do this in order to enable the encryption/codec modules from wxSQLite. Take a look at the SQLite source in the Android Git repository. Basically it's as easy and creating a Android.mk with the options (such as SQLITE_ENABLE_RTREE) you'd like enabled. Of course, this will give you a native library. In order to use it you'll need to access it from the NDK or create a wrapper (again, you can look at the Android repository and Java/JNI wrappers to SQLite)
回答2:
June 2017
- Go to the: download page and grab sqlite-android-xxxxx.aar
- Rename it to .aar instead of .zip
- Create a simple project with Android Studio (no need for C++ support)
- In the project tree right click app / new / Module select Import .JAR/.AAR Package
- Select the renamed file, click finish
- In Android Studio go to menu: File / Project structure. Click app (under Modules), select the Dependencies Tab, Add module dependency SQLite-android-xxxxx
- Before using any SQLite functions, call: System.loadLibrary("sqliteX");
- Replace SQlite imports to org.sqlite.database.sqlite.xxxxxx
In onCreate you can make a quick test with a memory database:
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();
The links (for all of the above):
- SQLite Android Bindings
- Installation
- Very Simple App
- Application Programming
- The SQLite R*Tree Module
回答3:
This worked for me, extract from Android.mk file. It is for spatialite, sqlite spatial extension.
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)
回答4:
https://www.sqlite.org/android/doc/trunk/www/index.wiki gives exactly the answer to your question and contains a step-by-step guide to install SQLite for your application with NDK/JNI.
Note that you have to add LOCAL_CFLAGS += -DSQLITE_ENABLE_RTREE
in the jni/sqlite/Android.mk file as suggested by the documentation to compile with R-Tree Module enabled.
Don't forget to update your imports or the default SQLite database will be used.
来源:https://stackoverflow.com/questions/6132442/android-sqlite-r-tree-how-to-install-module