5

http://www.sqlite.org/rtree.html说 r*tree “包含在合并中,但默认情况下被禁用”并启用它“只需使用定义的 SQLITE_ENABLE_RTREE C 预处理器宏进行编译”

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

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

4

4 回答 4

4

2017 年 6 月

  1. 转到:下载页面并获取 sqlite-android-xxxxx.aar
  2. 将其重命名为 .aar 而不是 .zip
  3. 使用 Android Studio 创建一个简单的项目(无需C++ 支持)
  4. 在项目树中右击 app/new/Module 选择 Import .JAR/.AAR Package
  5. 选择重命名的文件,点击完成
  6. 在 Android Studio 中,转到菜单:文件/项目结构。点击 app(在 Modules 下),选择 Dependencies 选项卡,添加模块依赖 SQLite-android-xxxxx
  7. 在使用任何 SQLite 函数之前,调用: System.loadLibrary("sqliteX");
  8. 将 SQlite 导入替换为 org.sqlite.database.sqlite.xxxxxx
  9. 在 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();
    

链接(以上所有):

于 2017-06-20T13:01:11.140 回答
2

你完全可以编译你自己的 SQLite 版本。我们这样做是为了从 wxSQLite 启用加密/编解码器模块。查看 Android Git 存储库中的 SQLite 源代码。基本上,它很容易创建一个带有您想要启用的选项(例如 SQLITE_ENABLE_RTREE)的 Android.mk。当然,这会给你一个原生库。为了使用它,您需要从 NDK 访问它或创建一个包装器(同样,您可以查看 Android 存储库和 Java/JNI 包装器到 SQLite)

于 2011-06-01T15:29:07.593 回答
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)
于 2011-08-02T11:29:47.007 回答
1

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 数据库。

于 2014-12-23T21:23:50.627 回答