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?
Wozu? Sortiert wird bei der Abfrage. Deine Idee geht konträr zum Sinn und Arbeitsprinzip von SQL Datenbanken.
:
Bearbeitet durch User
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 ...).
:
Bearbeitet durch User
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?
Heißt "App", dass du Android benutzt? Dann gibt es z.B. die Collations UNICODE und LOCALIZED.
:
Bearbeitet durch User
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.html Caligulaminus 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.
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.