Dieses Projekt wird aus SQLite Android-Bindungen kopiert und modifiziert, um Erweiterungslade- , Volltext-Suchvorgänge und Multisprach-Wörter zu unterstützen. Bitte lesen Sie die Dokumentation SQLite Android Bindings, um weitere Informationen zu erhalten.
Die folgenden Details sollten Sie vor der Verwendung bewusst sein:
version 3.17.0 .armeabi-v7a und arm64-v8a . Dieses Projekt bietet Tools, die in der Befehlszeile ausgeführt werden, die nur dem aktuellen Support Unix-like OS und die folgenden Befehle auf BUID ausführen:
$ cd / < your-project-dir > /host
$ chmod +x build.sh
$ ./build.sh Jetzt finden Sie eine ausführbare Datei mit dem Namen sqlite3 und 3 Erweiterungsbibliotheken im Verzeichnis ./out . Führen Sie die folgenden Befehle in Ihrer Befehlszeile aus, um zu überprüfen, ob sie funktioniert:
$ 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 Überprüfen Sie die Datei build.sh , um die Kompilieroptionen zu finden. Es gibt noch viel mehr, die Sie vielleicht wissen möchten. Lesen Sie bitte dieses Thema: So kompilieren Sie SQLite.
Alle die ersten, bitte stellen Sie sicher, dass Sie NDK installiert haben, und fügen Sie den folgenden Code in Ihre local.properties -Datei hinzu, um die Bibliotheken zu erstellen:
ndk.dir=/your/ndk/directory
Die vorgefertigten Intensivbibliotheken werden im Verzeichnis platziert ./sqlite3/src/main/jni/sqlite/icu_lib_[arch] . Überprüfen Sie bitte dieses Projekt, um weitere Informationen darüber zu erhalten, wie die ICU4C mit Cross-Compile- icu4c zusammengefasst werden kann.
Laden Sie die native Bibliothek:
System . loadLibrary ( "sqliteX" ); Ersetzen Sie den Namespace android.database.sqlite durch org.sqlite.database.sqlite . Zum Beispiel Folgendes:
import android . database . sqlite . SQLiteDatabase ;sollte ersetzt werden durch:
import org . sqlite . database . sqlite . SQLiteDatabase ;Weitere Informationen finden Sie in diesem Thema.
FTS3 und FTS4 sind virtuelle SQLite-Tabellenmodule, mit denen Benutzer Volltext-Suchen in einer Reihe von Dokumenten durchführen können.
Wir verwenden FTS3 und FTS4 , um Volltext-Suchvorgänge auszuführen, und icu um multi-language words segmentation in SQLite durchzuführen.
Der folgende Code zeigt, wie FTS und ICU verwendet werden.
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 (); Sie können die binary operators verwenden, um logische Suchanfragen auszuführen und die Hilfsfunktionen zu kombinieren, um kompliziertere Suchanfragen auszuführen. Weitere Informationen finden Sie in der Dokumentation.
SQLite kann zur Laufzeit verlängert (einschließlich neuer Anwendungsfunktionen, SQL-Funktionen, sammelnde Sequenzen, virtuelle Tabellen und VFSEs) laden. Mit dieser Funktion können der Code für Erweiterungen separat von der Anwendung entwickelt und getestet und dann nach Bedarf geladen werden.
Grundsätzlich ist eine SQLite -Erweiterung ein "Plugin", das eine Reihe spezifischer Funktionen implementiert und dynamisch in SQLite geladen werden kann.
Der folgende Code zeigt, wie Sie überprüfen, ob das Laden der Erweiterung unterstützt wird:
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 );Erweiterungsbelastung aktivieren oder deaktivieren:
// The following code CAN NOT run in a transaction
// Enable extension loading
db . enableLoadExtension ( true );
// Disable extension loading
db . enableLoadExtension ( false ); Nach der Aktivierung können Sie jetzt Ihre Erweiterungen laden. Nehmen Sie spellfix als Beispiel:
// 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 ));Das Schreiben Ihrer eigenen Erweiterungen ist auch einfach. Stellen Sie sicher, dass Sie dieses Thema gelesen haben.
Es gibt 3 integrierte Erweiterungen, offsets_rank , okapi_bm25 und spellfix , der Quellcode wird in das Verzeichnis integriert builtin_extensions . Diese Erweiterungen sind standardmäßig aktiviert. Sie können ihn deaktivieren, indem Sie den folgenden Code in Ihre local.properties -Datei hinzufügen.
useBuiltinExtensions=false
In der Dokumentation heißt es:
Diese virtuelle Tabelle mit SpellFix1 kann verwendet werden, um einen großen Wortschatz nach engen Übereinstimmungen zu durchsuchen. Beispielsweise kann SpellFix1 verwendet werden, um Korrekturen für falsch geschriebene Wörter vorzuschlagen. Oder es könnte mit FTS4 verwendet werden, um mit potenziell falsch geschriebenen Wörtern eine Volltext-Suche durchzuführen.
Sie können den neuesten Quellcode von hier herunterladen.
Ein kurzer Blick:
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
frustateWeitere Details finden Sie hier.
Eine Erweiterung, die mit der Funktion offsets () verwendet werden soll, um die einfache Relevanz einer FTS -Übereinstimmung zu berechnen. Der zurückgegebene Wert ist der Relevanzwert (ein realer Wert größer oder gleich Null). Ein größerer Wert zeigt ein relevanteres Dokument an.
Gemäß dem von der Funktion offsets() zurückgegebenen Wert enthält er 4 Ganzzahlwert für jeden Begriff. Der letzte Wert ist die Größe des übereinstimmenden Terms in Bytes. In der Regel hält der Wert dieselbe mit dem angegebenen Begriff, aber in einigen Fällen enthält beispielsweise bei der Erstellung einer FTS -Tabelle mit Option Tokenize = Porter und enthält die folgenden Aufzeichnungen:
docid content
------ -------
1 sleep
2 sleeping
Wenn wir die Abfragen ausführen:
SELECT docid, content, offsets(fts) FROM fts WHERE fts MATCH ' sleeping ' ;
SELECT docid, content, offsets(fts) FROM fts WHERE fts MATCH ' sleep ' ;wird genau die gleichen Ergebnisse erzielen:
docid content offsets
------ ------- -------
1 sleep 0 0 0 5
2 sleeping 0 0 0 8
Aber wir möchten, dass eine höhere Punktzahl beim Suchen nach sleeping sleeping höhere Punktzahl im Aufzeichnung hat. Die Funktion offsets_rank analysiert den von den offsets zurückgegebenen Wert und passt die Relevancy -Punktzahl an. Die folgende Abfrage gibt die Dokumente zurück, die mit der Volltext-Abfrage übereinstimmen, von den meisten nach am wenigsten relevanten:
SELECT docid, content FROM fts WHERE fts MATCH ' sleeping '
ORDER BY offsets_rank(offsets(fts)) DESC ;Die Ergebnisse werden sein:
docid content
------ --------
2 sleeping
1 sleep
Diese Datei ist eine Gabel von SQLite-OKAPI-BM25, dh unter der MIT-Lizenz. Die Ranking-Funktion verwendet die integrierte MatchInfo-Funktion, um die zur Berechnung der Bewertungen erforderlichen Daten zu erhalten. Stellen Sie sicher, dass Sie diese Dokumentationen vor der Verwendung gelesen haben.
Mit Ausnahme der in SQLite enthaltenen Dateien befinden sich alle anderen Dateien unter der MIT -Lizenz.