Android SQLite R-Tree - Как установить модуль? - PullRequest
5 голосов
/ 26 мая 2011

http://www.sqlite.org/rtree.html говорит, что дерево r * «включено как часть объединения, но по умолчанию отключено», и для его включения «просто скомпилируйте с определенным макросом препроцессора SQLITE_ENABLE_RTREE C»

Что ж, я хочу использовать R-деревья в моем приложении для Android, но ясно, что SQLite все предварительно установлен и т. Д. Есть ли способ включить его на телефоне / устройстве пользователя?

В качестве альтернативы, возможно ли использовать NDK и свободно доступный исходный код для SQLite?

Ответы [ 4 ]

2 голосов
/ 01 июня 2011

Вы можете абсолютно скомпилировать свою собственную версию SQLite. Мы делаем это для того, чтобы включить модули шифрования / кодеков из wxSQLite. Взгляните на источник SQLite в репозитории Android Git. По сути, это так же просто и создать Android.mk с параметрами (такими как SQLITE_ENABLE_RTREE), которые вы хотели бы включить. Конечно, это даст вам родную библиотеку. Чтобы использовать его, вам необходимо получить к нему доступ из NDK или создать оболочку (опять же, вы можете посмотреть на хранилище Android и оболочки Java / JNI для SQLite)

1 голос
/ 24 декабря 2014

https://www.sqlite.org/android/doc/trunk/www/index.wiki дает точный ответ на ваш вопрос и содержит пошаговое руководство по установке SQLite для вашего приложения с NDK / JNI.

Обратите внимание, что вы должны добавить LOCAL_CFLAGS += -DSQLITE_ENABLE_RTREE в файле jni / sqlite / Android.mk, как предлагается в документации для компиляции с включенным модулем R-Tree.

Не забудьте обновить импорт, иначе будет использоваться база данных SQLite по умолчанию.

1 голос
/ 02 августа 2011

Это сработало для меня, извлечение из файла Android.mk.Это для пространственного, квадратного пространственного расширения.

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)
0 голосов
/ 20 июня 2017

Июнь 2017

  1. Перейдите на: страницу загрузки и получите sqlite-android-xxxxx.aar
  2. Переименуйте его в .aar вместо .zip
  3. Создание простого проекта с Android Studio ( нет требуется поддержка C ++)
  4. В дереве проекта щелкните правой кнопкой мыши приложение / новый / Модуль и выберите Импорт .JAR / .AAR Package
  5. Выберите переименованный файл, нажмите Готово
  6. В Android Studio зайдите в меню: Файл / Структура проекта. Нажмите приложение (в разделе Модули), выберите вкладку Зависимости, Добавить зависимость модуля 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();
    

Ссылки (для всего вышеперечисленного):

...