2011-05-26 10 views
5

http://www.sqlite.org/rtree.html dice que el árbol R * es "incluido como parte de la fusión, pero está desactivado por defecto" y permitir que "simplemente compilar con la SQLITE_ENABLE_RTREE macro C-preprocesador define"Android SQLite R-Tree - ¿Cómo instalar el módulo?

Bueno, yo quiero utilizar R- árboles en mi aplicación de Android, pero claramente SQLite está todo preinstalado, etc. ¿Hay alguna manera de habilitarlo en el teléfono/dispositivo de un usuario?

Como alternativa, ¿es posible utilizar el NDK y el código fuente de libre acceso para SQLite?

Respuesta

2

Puede compilar absolutamente su propia versión de SQLite. Hacemos esto para habilitar los módulos de cifrado/códec desde wxSQLite. Eche un vistazo a la fuente de SQLite en el repositorio de Android Git. Básicamente es tan fácil y está creando un Android.mk con las opciones (como SQLITE_ENABLE_RTREE) que te gustaría habilitar. Por supuesto, esto te dará una biblioteca nativa. Para usarlo necesitarás acceder desde el NDK o crear un contenedor (de nuevo, puedes mirar el repositorio de Android y los contenedores Java/JNI a SQLite)

+0

Esto es lo que terminé haciendo, pero todavía parece tonto tener instalado dos veces en el dispositivo de cada usuario –

+0

tengo que preguntar ... haciendo lo mismo aquí SQlite. Construyó el nativo sqlite3 sin problemas allí. ¿Tiene algún enlace a los envoltorios de JNI en SQLite? Estoy esperando que no tenga que escribir el envoltorio desde cero. – George

+0

@George: Usamos SQLite en nuestro código nativo con un contenedor C++ y nunca directamente desde Java -> JNI, lo siento. – NuSkooler

1

Esto funcionó para mí, extracto de Android. archivo mk. Es para spatialite, extensión espacial 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 da exactamente la respuesta a su pregunta y contiene una guía paso a paso para instalar SQLite para su aplicación con NDK/JNI.

Tenga en cuenta que debe agregar LOCAL_CFLAGS += -DSQLITE_ENABLE_RTREE en el archivo jni/sqlite/Android.mk como lo sugiere la documentación para compilar con el Módulo R-Tree habilitado.

No olvide actualizar sus importaciones o se utilizará la base de datos SQLite predeterminada.

0

de junio de 2017

  1. Ir a la: download page y agarrar sqlite-android-xxxxx.aar
  2. Cambiar el nombre a .aar en lugar de .zip
  3. Crear un proyecto sencillo con Android Studio (sin necesidad de apoyo C++)
  4. En el árbol del proyecto, haga clic derecho app/nueva/Módulo seleccione Importar .JAR/.AAR paquete
  5. seleccione el archivo renombrado, haga clic en finalizar
  6. En Android Studio vaya al menú: Archivo/Estructura del proyecto. Haga clic en la aplicación (en Módulos), seleccione la pestaña Dependencias, Agregar dependencia de módulo SQLite-android-xxxxx
  7. Antes de usar cualquier función SQLite, llame a: System.loadLibrary ("sqliteX");
  8. Reemplace las importaciones de SQlite en org.sqlite.database.sqlite.xxxxxx
  9. En onCreate se puede hacer una prueba rápida con una base de datos de la memoria:

    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(); 
    

Los enlaces (para todos los de la anterior):

Cuestiones relacionadas