Este projeto é copiado e modificado a partir de ligações sqlite android para suportar carregamento de extensão , pesquisas de texto completo e segmentação de palavras em vários idiomas . Leia a documentação do SQLite Android Bindings para obter mais informações.
Os seguintes detalhes que você deve estar ciente antes de usá -lo:
version 3.17.0 .armeabi-v7a e arm64-v8a . Este projeto fornece ferramentas executadas apenas na linha de comando, suporte atual Unix-like OS , execute os seguintes comandos para Buid:
$ cd / < your-project-dir > /host
$ chmod +x build.sh
$ ./build.sh Agora você encontrará um arquivo executável chamado sqlite3 e 3 bibliotecas de extensão no diretório ./out . Execute os seguintes comandos em sua linha de comando para verificar se 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 Verifique o arquivo build.sh para descobrir as opções de compilação, há muito mais que você pode saber, leia este tópico: como compilar o SQLite.
Todos os primeiros, certifique -se de instalar NDK e adicione o seguinte código ao seu arquivo local.properties para construir as bibliotecas:
ndk.dir=/your/ndk/directory
As bibliotecas de UTI pré-construídas são colocadas no diretório ./sqlite3/src/main/jni/sqlite/icu_lib_[arch] , verifique este projeto para obter mais informações sobre como fazer icu4c cruzado.
Carregue a biblioteca nativa:
System . loadLibrary ( "sqliteX" ); Substitua o espaço para nome android.database.sqlite com org.sqlite.database.sqlite . Por exemplo, o seguinte:
import android . database . sqlite . SQLiteDatabase ;deve ser substituído por:
import org . sqlite . database . sqlite . SQLiteDatabase ;Para mais detalhes, leia este tópico.
FTS3 e FTS4 são módulos de tabela virtual SQLite que permitem aos usuários executar pesquisas de texto completo em um conjunto de documentos.
Usamos FTS3 e FTS4 para executar pesquisas de texto completo e icu para executar multi-language words segmentation no SQLite.
O código a seguir mostra como 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 (); Você pode usar os binary operators para executar pesquisas lógicas e combinar as funções auxiliares para executar pesquisas mais complicadas. Para mais detalhes, leia a documentação.
O SQLite tem a capacidade de carregar extensões (incluindo novas funções SQL definidas pelo aplicativo, sequências de coleta, tabelas virtuais e VFSEs) em tempo de execução. Esse recurso permite que o código para que as extensões sejam desenvolvidas e testadas separadamente do aplicativo e depois carregadas de forma conforme necessário.
Basicamente, uma extensão SQLite é um "plug -in" que implementou um conjunto de funções específicas e pode ser carregado no sqlite dinamicamente.
O código a seguir mostra como verificar se o carregamento da extensão é suportado:
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 ou desativar o carregamento de extensão:
// The following code CAN NOT run in a transaction
// Enable extension loading
db . enableLoadExtension ( true );
// Disable extension loading
db . enableLoadExtension ( false ); Depois de ativado, você pode carregar suas extensões agora, tome spellfix como exemplo:
// 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 ));Escrever suas próprias extensões também é simples, certifique -se de ler este tópico.
Existem 3 extensões construídas, offsets_rank , okapi_bm25 e spellfix , o código -fonte é colocado no diretório builtin_extensions . Essas extensões são ativadas por padrão, você pode desativá -lo adicionando o seguinte código ao seu arquivo local.properties .
useBuiltinExtensions=false
A documentação disse:
Esta tabela virtual do spellfix1 pode ser usada para pesquisar um grande vocabulário por partidas próximas. Por exemplo, o spellfix1 pode ser usado para sugerir correções para errar palavras. Ou pode ser usado com o FTS4 para fazer pesquisa de texto completo usando palavras potencialmente incorretas.
Você pode baixar o código fonte mais recente daqui.
Uma olhada 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
frustateMais detalhes podem ser encontrados aqui.
Uma extensão a ser usada com as compensações de função () para calcular a relevância simples de uma correspondência de FTS. O valor retornado é a pontuação de relevância (um valor real maior ou igual a zero). Um valor maior indica um documento mais relevante.
De acordo com o valor retornado pelas offsets() , ele contém 4 valor inteiro em cada termo, o último valor é o tamanho do termo correspondente em bytes, normalmente o valor mantém o mesmo com o termo especificado, mas em alguns casos, por exemplo, ao criar uma tabela FTS com tokenize = porter e contém os seguintes registros:
docid content
------ -------
1 sleep
2 sleeping
Quando executamos as consultas:
SELECT docid, content, offsets(fts) FROM fts WHERE fts MATCH ' sleeping ' ;
SELECT docid, content, offsets(fts) FROM fts WHERE fts MATCH ' sleep ' ;terá exatamente os mesmos resultados:
docid content offsets
------ ------- -------
1 sleep 0 0 0 5
2 sleeping 0 0 0 8
Mas queremos uma pontuação mais alta no sleeping recorde quando as pesquisas de sleeping , o função offsets_rank analisará o valor retornado pelas offsets da função e ajustará a pontuação de relevância. A consulta a seguir retorna os documentos que correspondem à consulta de texto completo classificada da maioria à menos relevante:
SELECT docid, content FROM fts WHERE fts MATCH ' sleeping '
ORDER BY offsets_rank(offsets(fts)) DESC ;Os resultados serão:
docid content
------ --------
2 sleeping
1 sleep
Este arquivo é um garfo do sqlite-okapi-bm25, que está sob a licença do MIT. A função de classificação usa a função Matchinfo integrada para obter os dados necessários para calcular as pontuações. Verifique se você leu essas documentações antes do uso.
Exceto os arquivos incluídos no SQLite, todos os outros arquivos estão sob a licença do MIT.