Este proyecto se copia y modifica a partir de enlaces de Android SQLite para admitir la carga de extensión , las búsquedas de texto completo y la segmentación de palabras de varios idiomas . Lea la documentación de enlaces de Android SQLite para obtener más información.
Los siguientes detalles deben tener en cuenta antes de usarlo:
version 3.17.0 .armeabi-v7a y arm64-v8a . Este proyecto proporciona herramientas ejecutadas en línea de comandos, soporte actual Unix-like OS solamente, ejecute los siguientes comandos a BUID:
$ cd / < your-project-dir > /host
$ chmod +x build.sh
$ ./build.sh Ahora encontrará un archivo ejecutable llamado sqlite3 y 3 bibliotecas de extensión en el directorio ./out . Ejecute los siguientes comandos en su línea de comandos para verificar si funciona:
$ cd out
$ . / sqlite3
SQLite version 3 . 17 . 0 2017 - 02 - 13 16 : 02 : 40
Enter " .help " for usage hints.
Connected to a transient in - memory database.
Use " .open FILENAME " to reopen on a persistent database.
sqlite > SELECT sqlite_compileoption_used( ' ENABLE_LOAD_EXTENSION ' );
1
sqlite > SELECT load_extension( ' ./libspellfix ' );
sqlite > CREATE VIRTUAL TABLE spellfix USING spellfix1;
sqlite > INSERT INTO spellfix(word) VALUES ( ' frustrate ' );
sqlite > INSERT INTO spellfix(word) VALUES ( ' Frustration ' );
sqlite > SELECT word FROM spellfix WHERE word MATCH ' frus ' ;
frustrate
Frustration Consulte el archivo build.sh para averiguar las opciones de compilación, hay mucho más que puede saber, lea este tema: cómo compilar SQLite.
Todo el primero, asegúrese de haber instalado NDK , luego agregue el siguiente código a su archivo local.properties .
ndk.dir=/your/ndk/directory
Las bibliotecas de la UCI prebuilt se colocan en el directorio ./sqlite3/src/main/jni/sqlite/icu_lib_[arch] , consulte este proyecto para obtener más información sobre cómo compilar cruzado icu4c .
Cargue la biblioteca nativa:
System . loadLibrary ( "sqliteX" ); Reemplace el espacio de nombres android.database.sqlite con org.sqlite.database.sqlite . Por ejemplo, lo siguiente:
import android . database . sqlite . SQLiteDatabase ;debe ser reemplazado con:
import org . sqlite . database . sqlite . SQLiteDatabase ;Para más detalles, lea este tema.
FTS3 y FTS4 son módulos de tabla virtual SQLite que permiten a los usuarios realizar búsquedas de texto completo en un conjunto de documentos.
Utilizamos FTS3 y FTS4 para realizar búsquedas de texto completo, e icu para realizar multi-language words segmentation en SQLite.
El siguiente código muestra cómo usar FTS e ICU .
SQLiteDatabase db = helper . getWritableDatabase ();
// Create an FTS table with a single column - "content"
// that uses the "icu" tokenizer
db . execSQL ( "CREATE VIRTUAL TABLE icu_fts USING fts4(tokenize=icu)" );
// Insert texts into the table created before
db . execSQL ( "INSERT INTO icu_fts VALUES('Welcome to China.')" );
db . execSQL ( "INSERT INTO icu_fts VALUES('Welcome to Beijing.')" );
db . execSQL ( "INSERT INTO icu_fts VALUES('中国欢迎你!')" );
db . execSQL ( "INSERT INTO icu_fts VALUES('北京欢迎你!')" );
// Perform full-text searches
Cursor c = db . rawQuery ( "SELECT * FROM icu_fts WHERE icu_fts MATCH 'welcome'" , null );
while ( c . moveToNext ()) {
Log . d ( TAG , "search for 'welcome': " + c . getString ( 0 ));
// Should be:
// Welcome to China.
// Welcome to Beijing.
}
c . close ();
c = db . rawQuery ( "SELECT * FROM icu_fts WHERE icu_fts MATCH '欢迎'" , null );
while ( c . moveToNext ()) {
Log . d ( TAG , "search for '欢迎': " + c . getString ( 0 ));
// Should be:
// 中国欢迎你!
// 北京欢迎你!
}
c . close (); Puede usar los binary operators para realizar búsquedas lógicas y combinar las funciones auxiliares para realizar búsquedas más complicadas. Para más detalles, lea la documentación.
SQLite tiene la capacidad de cargar extensiones (incluidas nuevas funciones SQL definidas por aplicaciones, secuencias de recopilación, tablas virtuales y VFSE) en tiempo de ejecución. Esta característica permite que el código de extensiones se desarrolle y se pruebe por separado de la aplicación y luego se cargue según sea necesario.
Básicamente, una extensión de SQLite es un "complemento" que implementó un conjunto de funciones específicas y se puede cargar en SQLite dinámicamente.
El siguiente código muestra cómo verificar si se admite la carga de extensión:
SQLiteDatabase db = helper . getWritableDatabase ();
Cursor c = db . rawQuery ( "SELECT sqlite_compileoption_used('ENABLE_LOAD_EXTENSION')" , null );
// The result must not be 0
assert ( c . getInt ( 0 ) != 0 );Habilitar o deshabilitar la carga de extensión:
// The following code CAN NOT run in a transaction
// Enable extension loading
db . enableLoadExtension ( true );
// Disable extension loading
db . enableLoadExtension ( false ); Después de habilitar, puede cargar sus extensiones ahora, tomar spellfix como ejemplo:
// Load successfully if there are no exceptions thrown
Cursor c = db . rawQuery ( "SELECT load_extension('libspellfix')" , null );
c . moveToFirst ();
Log . i ( TAG , "Load spellfix, result = " + c . getInt ( 0 ));Escribir sus propias extensiones también es simple, asegúrese de haber leído este tema.
Hay 3 extensiones integradas, offsets_rank , okapi_bm25 y spellfix , el código fuente se coloca en el directorio builtin_extensions . Estas extensiones están habilitadas de forma predeterminada, puede deshabilitarlo agregando el siguiente código a su archivo local.properties .
useBuiltinExtensions=false
La documentación dijo:
Esta tabla virtual Spellfix1 se puede usar para buscar en un vocabulario grande para que los partidos cierres. Por ejemplo, SpellFix1 se puede usar para sugerir correcciones a palabras mal escritas. O bien, podría usarse con FTS4 para realizar una búsqueda de texto completo utilizando palabras potencialmente mal escritas.
Puede descargar el último código fuente desde aquí.
Una mirada rápida:
sqlite > SELECT load_extension( ' ./libspellfix ' );
sqlite > CREATE VIRTUAL TABLE demo USING spellfix1;
sqlite > INSERT INTO demo(word, rank) VALUES ( ' frustrate ' , 2 );
sqlite > INSERT INTO demo(word, rank) VALUES ( ' Frustration ' , 3 );
sqlite > INSERT INTO demo(word, rank) VALUES ( ' frustate ' , 1 );
sqlite > SELECT word FROM demo WHERE word MATCH ' fru* ' ;
frustrate
Frustration
frustateSe pueden encontrar más detalles aquí.
Una extensión para usar con la función Offsets () para calcular la relevancia simple de una coincidencia FTS. El valor devuelto es el puntaje de relevancia (un valor real mayor o igual a cero). Un valor mayor indica un documento más relevante.
De acuerdo con el valor devuelto por la función offsets() , contiene 4 valor entero en cada término, el último valor es el tamaño del término coincidente en bytes, generalmente el valor mantendrá lo mismo con el término dado, pero en algunos casos, por ejemplo, cuando se cree una tabla FTS con opción tokenize = portter, y contiene los siguientes registros:
docid content
------ -------
1 sleep
2 sleeping
Cuando ejecutamos las consultas:
SELECT docid, content, offsets(fts) FROM fts WHERE fts MATCH ' sleeping ' ;
SELECT docid, content, offsets(fts) FROM fts WHERE fts MATCH ' sleep ' ;obtendrá exactamente los mismos resultados:
docid content offsets
------ ------- -------
1 sleep 0 0 0 5
2 sleeping 0 0 0 8
Pero queremos una puntuación más alta en el registro sleeping cuando busca sleeping , la función offsets_rank analizará el valor devuelto por las offsets de la función y ajustará la puntuación de relevancia. La siguiente consulta devuelve los documentos que coinciden con la consulta de texto completo ordenado de la mayoría a menos relevante:
SELECT docid, content FROM fts WHERE fts MATCH ' sleeping '
ORDER BY offsets_rank(offsets(fts)) DESC ;Los resultados serán:
docid content
------ --------
2 sleeping
1 sleep
Este archivo es una bifurcación de SQLITE-OKAPI-BM25, que está bajo la licencia MIT. La función de clasificación utiliza la función MatchInfo incorporada para obtener los datos necesarios para calcular los puntajes. Asegúrese de haber leído estas documentos antes de usar.
Excepto los archivos incluidos en SQLite, todos los demás archivos están bajo la licencia MIT.