SQLite - AutoIncrement - Primärschlüssel

  • Antworten:26
Jakob N.
  • Forum-Beiträge: 282

28.10.2014, 20:52:42 via Website

Hallo liebe Community :))

Habe gerade ein Problem mit SQLite.

Ich habe eine Tabelle bei der eine eindeutige ID gemeinsam mit dem Username der Primary Key sein soll.

Nun will ich aber dass die ID AutoIncrement ist, jedoch nur wenn eine ID angegeben wird, wenn keine ID angegeben wird, sprich NULL soll der AutoIncrement verwendet werden.

Weiß jemand ob das möglich ist?

Bin leider daweil bei meinen versuchen gescheitert.

Zurzeit schauen meine creates so aus:

private static final String CREATE_CALENDAR_EVENT = "CREATE TABLE "
        + TABLE_CALENDAR_EVENT + "(" + KEY_EVENT_ID
        + " INTEGER PRIMARY KEY, " + KEY_USER + " TEXT NOT NULL,"
        + KEY_EVENT_TITLE + " TEXT," + " UNIQUE(" + KEY_EVENT_ID
        + "," + KEY_USER + ")" + ")";

Und mein insert:

ContentValues values = new ContentValues();
    if (getId() != -1) {
        values.put(KEY_EVENT_ID,getId());
    }
    values.put(KEY_USER, event.getUser());
    values.put(KEY_EVENT_TITLE, event.getTitle());

    // insert row
    long event_id = db.insert(TABLE_CALENDAR_EVENT, null, values);

Danke für Eure Hilfe! :)

LG Jakob

LG Jakob

Antworten
pepperonas
  • Forum-Beiträge: 434

28.10.2014, 21:06:48 via Website

Nun will ich aber dass die ID AutoIncrement ist, jedoch nur wenn eine ID angegeben wird, wenn keine ID angegeben wird, sprich NULL soll der AutoIncrement verwendet werden.

Das verstehe ich nicht^^ In MySQL gibt es den Befehl ON DUPLICATE KEY UPDATE, geht das in die richtige Richtung?
Vielleicht hilft das weiter?

Open Source

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

28.10.2014, 21:30:35 via App

Hmm sollte eigentlich ohne weiteres klappen. Ich benutze sowas in der art auch und bei mir wird nur AutoIncremwnt benutzt wenn feld NULL ist.
Welche auswirkungen hat das ganze denn?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jakob N.
  • Forum-Beiträge: 282

28.10.2014, 21:59:40 via Website

@Martin Pfeffer: So wie Pascal geschrieben hat meine ich es:

Ich benutze sowas in der art auch und bei mir wird nur AutoIncremwnt benutzt wenn feld NULL ist.

@Pascal: Meines Wissens bekomme ich die ID -1 und der Datensatz wird nicht eingefügt. Fehlermeldung bekomme ich keine, der Datensatz ist nur "verschwunden".

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

28.10.2014, 22:36:10 via App

Sehr seltsam ich würde es erstmalso testen:

Insert INTO Table (ID,Name,ttt)(12, Pascal,test)

So in etwas vlt falsche Syntax gerade nicht auswendig.. aber sinn ist verständlich.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Georg C.
  • Forum-Beiträge: 235

28.10.2014, 23:23:11 via Website

Hallo,
ob ein Feld AUTOINCREMENT oder nicht ist, regelt das AUTOINCREMENT.
Z.B.:
CREATE TABLE XXX (
a INTEGER PRIMARY KEY AUTOINCREMENT,
b INTEGER

Das a Feld in der XXX Tabelle ist erst jetzt (INTEGER PRIMARY KEY AUTOINCREMENT) "Automatisiert" ;)
Deine CREATE TABLE Stringkette ist aber (nur schnell drüber geguckt) auch NIX!

LG
Georg

Sorry für Gramatik & Stilistik Fehler.

Antworten
Jakob N.
  • Forum-Beiträge: 282

29.10.2014, 06:47:19 via App

@Pascal werde ich dann testen.

Ich glaube dass mein Primary Key schuld ist. Habe vergessen zu erwähnen dass ich
(1, 'user', '')
und
(1, 'user2', '')

beide möglich sein soll.. und dann noch
(NULL, 'user1', '')
(2, 'user2, '')

hoffe dass ist einigermaßen verständlich.

@Georg man muss AUTOINCREMENT nicht angeben schau dir mal den link an https://www.sqlite.org/autoinc.html

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

29.10.2014, 07:56:38 via App

Pass aber auf dass du dadurch keine Doppelten IDs hast. Das kann ganz schnell passieren wenn man nich aufpasst.
Unter umständen wäre es sogar sinvoll 2 ID falder zu benutzen das eine mit AI das andere von hand.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jakob N.
  • Forum-Beiträge: 282

29.10.2014, 08:31:35 via Website

Das Problem ist, ich habe Datensätze die in SQLite gespeichert werden und einen AI bekommen. Danach können die Datensätze online gespeichert werden (MySQL). Das ganze sollen mehrere User abrufen können. Das bedeutet wenn in MySQL ein Datensatz ist, hat der eine ID und ich möchte in SQLite (dann bei einem anderen User) den Datensatz speichern. Die ID sollte gleich sein, damit die zugehörigkeit bestehen bleibt.

Wie kann man das sauber lösen?
Habe mir gestern lange den Kopf darüber zerbrochen.

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

29.10.2014, 09:42:20 via App

Hnn wenn ich dich richtig verstanden habe:
MySql:
id:1 name:user1 testfeld:test

In der App:
MySql get Datensatz mit der ID=1 und speichere diesen in der SqLite.

Ehrlich gesagt hab ich das nicht nicht wirklich verstanden..

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jakob N.
  • Forum-Beiträge: 282

29.10.2014, 17:52:05 via Website

Also versuchen wirs nochmal:

Ich habe einen Kalender implementiert, bei dem man Ereignisse erstellen und speichern kann. So wird ein Ereignis direkt in SQLite gespeichert mit (ID, User, Title, Description, ... ). Ich speichere deswegen in SQLite weil das laden von MySQL mir zu lange dauert, obwohl das heut zutage schon ganz schön schnell passiert. Den User speichere ich deswegen, dass ich verhindere dass jeder User ein Ereignis speichert mit der ID 1, die dann eigentlich zwei ganz unterschiedliche Ereignisse sind. Nun möchte ich manche Ereignise online speichern, da diese andere User auch herunterladen können. Dazu speichere ich den Datensatz von SQLite einfach in MySQL. Nun muss ich wenn ich den Datensatz von MySQL herunterlade, diesen in SQLite speichern. Wichtig dabei ist, dass der Datensatz die selbe ID wie in MySQL bekommt.

Nochmal kurz zusammengefasst:
Speichern eines Datensatz in SQLite mit AI
Speichern eines Datensatz in MySQL genau wie in SQLite geinserted (ID = AI)
Herunterladen eines Datensatzes von MySQL, inserten diesen Datensatzes in SQLite mit der genau selben ID wie in MySQL bzw. SQLite des anderen Users gespeichert.

Hoffentlich ist es jetzt verständlicher :)

LG Jakob

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

29.10.2014, 19:48:22 via App

Ich würde es andera machen. Dann hast du das ganze Problem nicht:
In beiden DBs führst du ein AI Feld ID. Das lässt du in beiden erstmal unberührt und selber hochzählen.
Als 2. Feld uast du dann so zu sagen ein Refferal Feld in dem du sagst SqLite mit id=10 des Users Test1 hat ID = 144 in der Online MySql so ist eine Verknüpfung vorhanden.
Kann auch sein dass meine Theorie fehler enthält die mir gerade nicht einfallen..

LG

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jakob N.
  • Forum-Beiträge: 282

29.10.2014, 19:54:35 via Website

Könntest du mir bitte deine Idee eventuell mit Beispiele erklären... weiß leider nicht genau wie du das meinst.

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

30.10.2014, 06:41:15 via App

Vergess meine Theorie die Fehler sind mir gerade aufgefallen....

Wieso muss es unbedingt die gleiche ID sein wie in SQLite?
Das macht die Sache so kompliziert und es funktio iert auch nicht immer da man verschiedene User und somit unterschiedliche lokale DBs hat.
So nun ist die Frage wie ist es gedacht?
Denn so wie es bisher ist, kann jeder jeden Termin herunterladen der einmel hochgeladen wurde. Ist das Absicht?
Sonst brauchst du noch ein Feld Freigegeben für etc.

Und ohne das ID gedöns kann der User auch einfach online Termine zum herunterladen auswählen diese werden dann ohne weiteres lokal gespeichert da ist die ID doch unwichtig oder sehe ich das Falsch?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jakob N.
  • Forum-Beiträge: 282

30.10.2014, 21:57:39 via App

Du hast recht ein freigegeben Feld wär nicht schlecht ... aber dass is mir iwie zu umständlich daweil, da eh nur die Termine online sind, die jeder sehen soll.

Die ID ist deswegen wichtig, da wenn der User den Termin bearbeitet, die Änderungen jeder User bekommen soll.

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

30.10.2014, 22:02:47 via App

Terminupdates würde ich per GCM regeln und die id ignorieren also die lokale.
Die gcm kann ja folgendes enthalten:
(symbolisch;an alle clients)
"Hey ich hab hier ein Update des termins xy mit der id 123 inder online db bitte lösche deinen lokalen und lade diesen Termin neu herunter."

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jakob N.
  • Forum-Beiträge: 282

30.10.2014, 22:17:38 via App

Wie ist der Termin dann aber eindeutig?

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

30.10.2014, 22:25:12 via App

Das stimmt auch wieder. Dann wären manche Termine nicht eindeutig.
Hmm.. sehr schwieriges Problem.

Wie wärs denn einfach fortlaufende ids zu nutzen also du fängst mit 1 an und jeder termin der erstellt wird zählt höher d.h. aber du benötigst bei jedem erstellten Termin einen Onlinecounter der zählt. und die App müsste immer die aktuelle id aus dem inet laden...
Auch nicht die Beste Lösung...
Vlt. solltest du dir das noch ein paar mal duch den Kopf gehen lassen.
In solchen Fällen setze ich mich ohne pc etc. in ne ruhige eche und mache es erstmal in er theorie auf einem Papier.
Manchmal hilft es manchmal auch nicht...
LG

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jakob N.
  • Forum-Beiträge: 282

30.10.2014, 22:30:26 via App

Habe ich auch schon probiert außer das der ganze zettl danach vollgekritzelt war... leider kein ergebnis :(

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

30.10.2014, 22:46:04 via App

Es muss doch sowas schon geben du bist ja nicht der erste mit diesem Problem.
Leider gehen mir auch langsam die ideen aus...

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jakob N.
  • Forum-Beiträge: 282

30.10.2014, 22:47:08 via App

Ich könnte doch einfach in SQLite eine Spalte mit der Online-ID machen oder???

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

30.10.2014, 22:50:03 via App

Jo dann icht nur noch die Frage wann die online ID da reingeschriebien wird. Am besten beim Hochladen.
Dann gibts 2 relativ unabhängige ids und loak einen Verweis auf die online.
Hoffentlich gibts da keinen Haken, bin schon ein bissl müde und kann nichtmehr klar denken ^^

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jakob N.
  • Forum-Beiträge: 282

30.10.2014, 22:53:30 via App

ich auch nicht ganz sollte aber so hinhauen, werde dass morgen ausprogrammieren :)) gib dir dann beacheid.

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

30.10.2014, 22:57:46 via App

Ich habe mal deine mehrfachposts entfernt.
LG

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jakob N.
  • Forum-Beiträge: 282

31.10.2014, 08:56:17 via App

Ah sry die App hat ein bisserl gesponnen :/

LG

LG Jakob

Antworten
Jakob N.
  • Forum-Beiträge: 282

03.11.2014, 11:45:41 via Website

Gibt es eine Möglichkeit in MySQL den AI abzufragen der gerade ingeserted wurde?

LG Jakob

Antworten
Jakob N.
  • Forum-Beiträge: 282

03.11.2014, 14:46:43 via Website

Hat sich schon erledigt!

Habe es jetzt so implementiert! Daweil sind mir noch keine Inkonsiszenzen untergekommen :)

LG Jakob

Antworten