SQLite Datenbank: Zeilen hinzufügen (id automatisch anpassen)

Gast #4916403
Lesenswert?

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?
Gast #4916410
Lesenswert?

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?
Gast #4916445
Lesenswert?

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?
Gast #4916465
Lesenswert?

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.
Gast #4916470
Lesenswert?

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.
#4916489
Lesenswert?

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).
Gast #4916516
Lesenswert?

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
#4916629
Lesenswert?

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.
Gast #4916664
Lesenswert?

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?
#4916725
Lesenswert?

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ß.
Gast #4916797
Lesenswert?

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...
Gast #4916845
Lesenswert?

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.
Gast #4916846
Lesenswert?

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?
#4916902
Lesenswert?

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, ...).
#4917366
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren