Forum: PC-Programmierung SQLite Datenbank: Zeilen hinzufügen (id automatisch anpassen)


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Frank (Gast)


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?

von (prx) A. K. (prx)


Lesenswert?

Wozu? Sortiert wird bei der Abfrage. Deine Idee geht konträr zum Sinn 
und Arbeitsprinzip von SQL Datenbanken.

: Bearbeitet durch User
von Frank (Gast)


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?

von (prx) A. K. (prx)


Lesenswert?

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
von Frank (Gast)


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?

von Clemens L. (c_l)


Lesenswert?

Heißt "App", dass du Android benutzt? Dann gibt es z.B. die Collations 
UNICODE und LOCALIZED.

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


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.

von Peter II (Gast)


Lesenswert?

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.

von Frank (Gast)


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.

von (prx) A. K. (prx)


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).

von Caligulaminus (Gast)


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

von S. R. (svenska)


Lesenswert?

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.

von Clemens L. (c_l)


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.

von Caligulaminus (Gast)


Lesenswert?

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?

von c.m. (Gast)


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?

von S. R. (svenska)


Lesenswert?

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.

von Clemens L. (c_l)


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ß.

von Caligulaminus (Gast)


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...

von S. R. (svenska)


Lesenswert?

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.

von Caligulaminus (Gast)


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.

von Frank (Gast)


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?

von S. R. (svenska)


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, ...).

von Clemens L. (c_l)


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.

: 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
Noch kein Account? Hier anmelden.