Ich habe vor eine Wörterbuchapp zu programmieren für eine semitische
Sprache (Arabisch,...). Die Daten muss ich alle selber eintregen. Das
problem ist: Ich will alle Daten alphabetisch eintragen. Sagen wir ich
habe jetzt die erste Datenbank mit 200 Wörter fertig. Ich will jetzt
irgendwo bei index = 25 ein neues Wort einfügen und der Index (auto
increment) soll sich automatisch verschieben.
Ich arbeite gerade mit dem "DB Browser for SQLite" und da gibt es keine
möglichkeit eine Zeile irgendwo einzufügen.
Habt ihr irgendeine Idee wie man so etwas realisieren könnte?
A. K. schrieb:> Welchen Sinn sollte das haben? Sortiert wird bei der Abfrage.
Das stimmt schon. Ich habe einen Wortvorschlagmechanismus programmiert
und ich will, dass dieser alphabetische angezeigt wird. Oder meinst,
dass das mit SORT gehen könnte obwohl ich zb Arabisch oder Hebräisch DB
habe?
Mir ist nicht bekannt, wie SQLite damit umgeht, aber bei SQL-DBs wie
MySQL lässt sich Zeichensatz und Umgang damit bei der Tabellendefinition
angeben (define table ... collate ...), und auch bei der Abfrage (...
order by ... collate ...).
A. K. schrieb:> Mir ist nicht bekannt, wie SQLite damit umgeht, aber bei SQL-DBs wie> MySQL lässt sich Zeichensatz und Umgang damit bei der Tabellendefinition
Das ist mir schon klar. Aber SQLite kann das nicht.
Hättest du sonst eine idee wie man das realisieren könnte?
Frank schrieb:> Hättest du sonst eine idee wie man das realisieren könnte?
eine zusätzliche spalte die nur zum Sortieren genutzt wird. dort könnte
man double als Datentype verwenden, dann kannst du immer noch etwas
dazwischenschiebe.
A. K. schrieb:> Wozu? Sortiert wird bei der Abfrage.
Solange über das Sortierfeld indiziert ist, braucht zur Zeit der Abfrage
gar nichts mehr sortiert zu werden.
Der Index sorgt dafür, dass die Daten in der richtigen Reihenfolge
rauskommen. Wenn erst bei der Abfrage sortiert werden müsste, wäre das
performancemäßig ein ziemlicher Tiefschlag.
Wolfgang schrieb:> Wenn erst bei der Abfrage sortiert werden müsste, wäre das> performancemäßig ein ziemlicher Tiefschlag.
das macht man ständig und ist überhaupt keine Problem für eine
Datenbank.
Clemens L. schrieb:> Heißt "App", dass du Android benutzt? Dann gibt es z.B. die Collations> UNICODE und LOCALIZED.
Diese unterstützen aber nicht das Sortieren von Arabisch oder Hebräisch.
Peter II schrieb:> eine zusätzliche spalte die nur zum Sortieren genutzt wird. dort könnte> man double als Datentype verwenden, dann kannst du immer noch etwas> dazwischenschiebe.
Sehr gute Idee.
Wolfgang schrieb:> Der Index sorgt dafür, dass die Daten in der richtigen Reihenfolge> rauskommen. Wenn erst bei der Abfrage sortiert werden müsste, wäre das> performancemäßig ein ziemlicher Tiefschlag.
Das verstehe ich nicht.
Wolfgang schrieb:> Solange über das Sortierfeld indiziert ist, braucht zur Zeit der Abfrage> gar nichts mehr sortiert zu werden.
Klar.
> Der Index sorgt dafür, dass die Daten in der richtigen Reihenfolge> rauskommen. Wenn erst bei der Abfrage sortiert werden müsste, wäre das> performancemäßig ein ziemlicher Tiefschlag.
Kommt nicht so selten vor. Mal hast du in der Abfrage eine Union drin,
mal sortierst du eine fabrizierte Spalte, mal kommt der Optimizer zum
Schluss, lieber vorneweg einen full table scan zu fahren (zumindest bei
grösseren DBs).
Frank schrieb:> A. K. schrieb:>> Mir ist nicht bekannt, wie SQLite damit umgeht, aber bei SQL-DBs wie>> MySQL lässt sich Zeichensatz und Umgang damit bei der Tabellendefinition>> Das ist mir schon klar. Aber SQLite kann das nicht.> Hättest du sonst eine idee wie man das realisieren könnte?
Laut Doku kann es das sehr wohl:
https://www.sqlite.org/c3ref/create_collation.html
Frank schrieb:>> ... UNICODE ...> Diese unterstützen aber nicht das Sortieren von Arabisch oder Hebräisch.
Unicode kann Arabisch und Hebräisch, also kann es beides auch sortieren.
Frank schrieb:> Clemens L. schrieb:>> UNICODE und LOCALIZED>> Diese unterstützen aber nicht das Sortieren von Arabisch oder Hebräisch.
Jede Collation unterstützt das Sortieren von beliebigen Zeichen. Es
könnte nur sein, dass die Reihenfolge nicht die von dir gewünschte ist
(und davon hast du nichts verraten).
> Wolfgang schrieb:>> Der Index sorgt dafür, dass die Daten in der richtigen Reihenfolge>> rauskommen.>> Das verstehe ich nicht.http://www.sqlite.org/queryplanner.htmlCaligulaminus schrieb:> Laut Doku kann es das sehr wohl:> https://www.sqlite.org/c3ref/create_collation.html
"Es" = "Android" kann das leider nicht.
Clemens L. schrieb:> "Es" = "Android" kann das leider nicht.
???
SQLite erlaubt es, sich seine eigenen Vergleichsfunktionen zu
definieren. Warum sollte das ausgerechnet unter Android nicht gehen?
indices sorgen dafür das daten auf denen dieser index liegt schneller
gefunden werden, das also kein full table scan bei jedem select
notwendig ist.
200 wörter sind allerdings so wenig, das der index wohl mehr overhead
produziert wie eine abfrage ohne.
bei viel mehr daten kann es vorteilhaft sein nach dem insert
hunderttausender daten einen index rebuild laufen zu lassen um den
b-tree (falls der verwendet wird) zu balancieren.
wie willst du eigentlich wortvorschläge realisieren? einen textindex
(!=index auf strings) verwenden? oder zerhackst du wörter und suchst
nach silben?
Wenn die Daten ohnehin per Hand eingetragen werden, kann man auch
einfach nach jedem neuen Eintrag neu sortieren lassen, also eine neue
Tabelle mit den passenden Indizes erzeugen.
Caligulaminus schrieb:> SQLite erlaubt es, sich seine eigenen Vergleichsfunktionen zu> definieren. Warum sollte das ausgerechnet unter Android nicht gehen?
Weil man unter Android normalerweise die Java-API benutzt, in der manche
Teile von SQLite fehlen.
Man könnte sich auch die SQLite-Bibliothek mit dem NDK für jede
Architektur selbst kompilieren, aber den Aufwand ist meistens zu groß.
Clemens L. schrieb:> Weil man unter Android normalerweise die Java-API benutzt, in der manche> Teile von SQLite fehlen.>> Man könnte sich auch die SQLite-Bibliothek mit dem NDK für jede> Architektur selbst kompilieren, aber den Aufwand ist meistens zu groß.
Oh, wie ich diese Bevormundungen, die mir "managed"-Zeugs wie Java- oder
.NET-Umgebungen angedeihen lassen liebe!
Naja, vielleicht kann man ja für seine App die locale auf "semitisch"
umstellen und dann mit LOCALIZED arbeiten. (Ich kenne mich mit Android
nicht aus).
Ähm... Ich bin mir jetzt gar nicht sicher, ob OT tatsächlich auf Android
abzielt.
Wenn's echt nur um Listen von ~200-1000 Worten geht, dann kann man auch
einfach selbst sortieren. Und ansonsten muß man eben seinen Mann stehen
und das NDK anwerfen...
Caligulaminus schrieb:> Naja, vielleicht kann man ja für seine App die locale auf "semitisch"> umstellen und dann mit LOCALIZED arbeiten.
Man kann auch einfach Unicode benutzen. Arabisch und Hebräisch sind
nicht besonders außergewöhnlich.
S. R. schrieb:> Man kann auch einfach Unicode benutzen. Arabisch und Hebräisch sind> nicht besonders außergewöhnlich.
Für unsere Buchstaben gibt es ja für Groß-/Kleinschreibung getrennte
Codepoints, da kann ich nicht einfach die Collation BINARY benutzen.
Wenn im Semitischen für die unterschiedlichen Darstellungen der
Buchstaben je nach Position jeweils der gleiche Codepoint verwendet
wird, dann sollte es kein Problem sein - unterstellt, daß UNICODE sich
auch an die gültige Reihenfolge der Buchstaben hält.
Ich habe eine Idee: Ich könnte meine ungeordnete SQLite Datenbank in ein
Jabaprogramm einspielen, dann sortieren und danach sortiert in die
Datenbank wieder reinschreiben. Dann hätte ich eine sortierte Datenbank,
die ich ins Android einbinden könnte.
Könnte mein Vorhaben gelingen? Oder habe ich etwas übersehen?
Caligulaminus schrieb:> Für unsere Buchstaben gibt es ja für Groß-/Kleinschreibung getrennte> Codepoints, da kann ich nicht einfach die Collation BINARY benutzen.
Bist du so schwer von Begriff oder trollst du nur? Ich sprach -
mehrfach! - von Unicode und du kommst mir mit "aber ich kann kein Binary
nutzen". Ja natürlich nicht.
Oder reparierst du dein Fahrrad ausschließlich mit Standbohrmaschine und
Stichsäge, weil das die einzigen Werkzeuge sind, die du kennst?
Frank schrieb:> Ich habe eine Idee:
Ja, das kannst du im Prinzip machen. Eine bescheuerte Idee ist es
trotzdem, weil die Datenbank selbst sortieren kann. Davon abgesehen ist
deine Datenmenge winzig (ein paar zig KB), da reicht es aus, wenn deine
Datenbank beim Start die gesamte Datenbank in den Speicher liest und
dann darauf arbeiten.
So wie ich dich verstehe, holst du dir von der Datenbank Vorschläge und
zeigst die in deiner App an, und du möchtest, dass die Vorschläge
sortiert sind. Warum sortierst du dann nicht in der App die von der
Datenbank gelieferten Vorschläge? Es werden ja nur selten mehr als 10
sein (ansonsten wird's unübersichtlich und du solltest vermutlich SELECT
.. LIMIT benutzen).
Dann hast du auch die Freiheit, nach beliebigen Kriterien zu sortieren
(häufig gesuchte Begriffe, alphabetisch, nach Zeichenform, ...).
Frank schrieb:> Dann hätte ich eine sortierte Datenbank
SQL-Tabellen sind konzeptuell nicht sortiert. Das heißt, dass ein SELECT
keine Reihenfolge garantiert, wenn du kein ORDER BY benutzt.
Wenn du aber die Wörter in eine Tabelle mit einem AUTOINCREMENT-Feld
schreibst, dann hast du automatisch eine Spalte, nach der du dann
sortieren kannst.
(Und in SQL benötigt man für AUTOINCREMENT nicht unbedingt
AUTOINCREMENT, siehe http://www.sqlite.org/autoinc.html.)
Caligulaminus schrieb:> unterstellt, daß UNICODE sich auch an die gültige Reihenfolge der> Buchstaben hält.
UNICODE hält sich an die Reihenfolge, die im UCA (Unicode Collation
Algorithm) definiert ist. Ob das die ist, die du für gültig hälst, musst
du selbst herausfinden.