安卓SQLite R-Tree - 如何安装模块?

5

http://www.sqlite.org/rtree.html中提到,r*tree是“作为综合部分包含但默认情况下被禁用的”,要启用它,“只需使用定义了SQLITE_ENABLE_RTREE C预处理器宏进行编译”。

我想在我的Android应用程序中使用R-trees,但显然SQLite已经预先安装等等。有没有办法在用户的手机/设备上启用它?

或者,是否可以使用NDK和免费提供的SQLite源代码?

4个回答

4

2017年6月

  1. Go to the: download page and grab sqlite-android-xxxxx.aar
  2. Rename it to .aar instead of .zip
  3. Create a simple project with Android Studio (no need for C++ support)
  4. In the project tree right click app / new / Module select Import .JAR/.AAR Package
  5. Select the renamed file, click finish
  6. In Android Studio go to menu: File / Project structure. Click app (under Modules), select the Dependencies Tab, Add module dependency SQLite-android-xxxxx
  7. Before using any SQLite functions, call: System.loadLibrary("sqliteX");
  8. Replace SQlite imports to org.sqlite.database.sqlite.xxxxxx
  9. 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();
    

以下是相关链接:

注意,以上链接保留了HTML标签。

2
您可以完全编译自己的SQLite版本。我们这样做是为了启用wxSQLite中的加密/编解码模块。请查看Android Git存储库中的SQLite源代码。基本上,只需创建一个Android.mk文件并使用所需选项(例如SQLITE_ENABLE_RTREE)即可。当然,这将给您提供一个本地库。为了使用它,您需要从NDK访问它或创建一个包装器(同样,您可以查看Android存储库和Java / JNI包装器以访问SQLite)。

这就是我最终所做的,但似乎在每个用户设备上安装两次SQlite仍然很愚蠢。 - James Coote
我必须问一下...在这里做同样的事情。构建sqlite3本地库没有问题。你有任何关于SQLite JNI包装器的链接吗?我希望不必从头开始编写包装器。 - George
@George:我们在本地代码中使用SQLite,使用C++包装器而不是直接从Java->JNI调用,抱歉。 - NuSkooler
基本上,我们在 APK 中作为资源提供的预构建 .db 文件会在首次运行时被提取。从那里开始,我们会下载并执行额外的脚本(我们有一个相当大的数据集)。所有的 DB 访问都是纯 C++ 实现的(通过 Java->JNI 访问)。不需要 root 权限,用户可以完全访问其应用程序数据目录。 - NuSkooler
@JamesCoote 我也遇到了同样的问题,“我想启用r*tree模块”,你能帮助我吗?我是Android的新手,或者你可以提供一篇文章来帮助我吗?谢谢。 - user4o01
显示剩余2条评论

1

这对我有用,从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)

1

https://www.sqlite.org/android/doc/trunk/www/index.wiki提供了您问题的确切答案,并包含安装适用于NDK/JNI应用程序的SQLite的逐步指南。

请注意,根据文档建议,您必须在jni/sqlite/Android.mk文件中添加LOCAL_CFLAGS += -DSQLITE_ENABLE_RTREE以启用R-Tree模块进行编译。

不要忘记更新导入内容,否则会使用默认的SQLite数据库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接