• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

GSAK - GDAK Datenbank Problem

geggi

Geocacher
Hallo zusammen,

ich habe folgendes Setting:

Die GSAK Datenbank liegt auf meinem Samsung Galaxy Smartphone und darauf auch unterwegs mit GDAK zugreifen zu können. Ich synchronisiere nicht mit DropBox, sondern greife mit GSAK direkt auf die Datenbank auf dem Mobiltelefon zu.

Wenn ich die Datenbank mit GDAK geöffnet hatte, meldet GSAK beim Öffnen immer, dass "Die zu öffnende Datenbank hat Version 5006, aber die installierte GSAK-Version unterstützt nur bis Version 26. [...] Es wird davon abgeraten diese Datenbank zu verwenden, da die Resultate unberechenbar sein können. (Fehlernumer: 32)." gsak_datenbankproblem.png

Kennt jemand diese Fehlermeldung und hat das gleiche Problem? Was sagen die Entwickler dazu? Scheint zwar irgendwie zu funktionieren, aber irgendwie hat man doch ein schlechtes Gefühl dass irgendwelche Daten korrupt sein könnten.

Grüße
geggi
 
OP
G

geggi

Geocacher
Ok. Scheinbar ist die Datenbank wirklich korrupt, denn das Anzeigen des SplitScreens führt zu einer Fehlermeldung :( Mist!!

Dieser Versuch GDAK zu testen ist wohl ordentlich schief gelaufen. Mit GSAK habe ich seit Jahren keine ernsthaften Probleme gehabt...
 

Team 'zZZz'

Geomaster
Mag sein, dass mein Wissen veraltet ist - dann bitte kurz darauf hinweisen ... :???:

Ich dachte eigentlich, dass GDAK die DBs in sein eigenes benötigtes Format konvertiert, demzufolge wäre es nur logisch, das GSAK danach ... nun, sagen wir mal: "irritiert" ist und die DB als nicht korrekt einstuft.

Oder geht es seit neuestem, dass von beiden Programme auf die *gleichen* DBs ohne Formatänderung zugegriffen werden kann ???

Cheers
Dirk
 
OP
G

geggi

Geocacher
Das Hin- und Herkopieren zwischen GDAK und GSAK funktioniert laut http://www.geocaching-blogbuch.de/gsak-android-gdak-und-aus-2-mach-1/ via DropBox ohne Probleme. Dabei wird auch die gleiche Datei zwischen PC und Smartphone synchronisiert - in beide Richtungen. Auch einer meiner Cacher-Kollegen hat die DropBox Lösung am Laufen und hat damit keine Probleme.
Ich würde gerne ohne DropBox arbeiten. Eigentlich sollte das direkte Kopieren und die DropBox-Variante keinen Unterschied machen?
 

Team 'zZZz'

Geomaster
geggi schrieb:
Dabei wird auch die gleiche Datei zwischen PC und Smartphone synchronisiert - in beide Richtungen.

Das ist der Part, den ich nach kürzerem Überlegen anzweifeln möchte. PC und Dropbox kein Problem, auch der "Download" / die Synchro auf das Smartphone wird funktionieren. Aber die Synchro zwischen einer geänderten Version auf dem Smartphone (GDAK) und der Dropbox?

Das kann nur funktionieren, wenn GDAK das gleiche DB-Format verwendet wie GSAK - und das ist meines Wissens nicht der Fall. Denn ansonsten gäbe es nicht bei jedem Import die "GSAK-Gedenkminute" (Formatierung der GSAK-DB in die GDAK-DB) bzw. mittlerweile auch schon ein GSAK-Macro, dass eine GDAK-DB erzeugt.

Aber wie gesagt - ich lasse mich gerne Überzeugen ... oder mein Wissen auffrischen.

Cheers
Dirk
 

Team 'zZZz'

Geomaster
Angestupps durch den "Herrn der Heuhaufen" ;) hab ich mir die Kommentare unter dem Artikel durchgelesen ... und siehe da:

Peter K schreibt am 24. Februar 2012:
[...]Nun gibt es aber ein klitzekleines Problem, und wie man vermuten kann, ist es nicht sooo klein.

DropSync synchronisiert grundsätzlich und ohne dies ändern zu können bidirektional. Das bedeutet, es schreibt die DB zurück in das von GSAK genutzte Dropbox-Verzeichnis. Ich habe zum Probieren eine DB mit 2 Caches, Bildern und Spoilern synchronisiert. Das geht auf GDAK richtig klasse. ich bin sowas von begeistert. Aber die DB, die zurückgeschrieben wird verursacht bei GSAK schwere Schäden und lässt dieses beim Ignorieren selbiger abstürzen. Machst Du irgendetwas anders als ich?
[...]

Cheers
Dirk
 
OP
G

geggi

Geocacher
Ok. Vielen Dank für eure Hinweise. Die Kommentare unten hatte ich nicht gelesen...
 
OP
G

geggi

Geocacher
So, nach einigem Kopfzerbrechen hier eine Lösung um GDAK Datenbanken zurück nach GSAK zu kopieren (ohne Gewähr!):

  • Zusätzliche Spalten in der DB entfernen:
    * SQLite für Windows (sqlite.exe) runterladen http://www.sqlite.org/download.html und in Verzeichnis kopieren
    * In der Windows command line (cmd.exe) folgenden Code ausführen:
    Code:
    sqlite3.exe sqlite.db3 < commands.txt
    Wobei sqlite.db3 eure GDAK Datenbankdatei ist (bei mir unter ..\GDAK\data\Test\) und commands.txt eine Textdatei mit folgenden SQL commands:
    Code:
    BEGIN TRANSACTION;
    CREATE TEMPORARY TABLE Caches_backup (Code text default '' not null, Name text default '' not null, Distance real default 0.00 not null, PlacedBy text default '' not null, Archived integer default 0 not null,   Bearing text default '' not null, CacheId text default '1' not null, CacheType text default 'O' not null, Changed text default current_date not null,   Container text default 'Unknown' not null, County text default '' not null, Country text default '' not null, Degrees real default 0.00 not null,   Difficulty real default  1.0 not null, DNF integer default  0 not null, DNFDate text default '' not null, Found integer default  0 not null,   FoundCount integer default  0 not null, FoundByMeDate text default  '' not null, FTF integer default  0 not null, HasCorrected integer default  0 not null,   HasTravelBug integer default  0 not null, HasUserNote integer default 0 not null, LastFoundDate text default '' not null,   LastGPXDate text default '' not null, LastLog text default '' not null, LastUserDate text default current_date  not null, Latitude text default '0.0' not null,   Lock integer default 0 not null,LongHtm integer default 0 not null, Longitude text default '0.0' not null, MacroFlag integer default 0 not null,   MacroSort text default '' not null, NumberOfLogs integer default 0 not null,OwnerId text default '' not null, OwnerName text default '' not null,   PlacedDate text default current_date not null, ShortHtm integer default 0 not null, SmartName text default '' not null,SmartOverride integer default 0 not null,   Source text default '' not null, State text default '' not null, Symbol textdefault '' not null, TempDisabled integer default 0 not null,   Terrain real default 1.0 not null, UserData text default '' not null, User2 text default '' not null, User3 text default '' not null,   User4 text default '' not null, UserFlag integer default 0 not null, UserNoteDate text default  '' not null, UserSort integer default 0 not null,   Watch integer default 0 not null, IsOwner integer default 0 not null, LatOriginal text default '0.0' not null, LonOriginal text default '0.0' not null,   Created text default current_date not null, Status text default 'A' not null, Color text default '' not null, ChildLoad integer default 0 not null,   LinkedTo text default '' not null, GetPolyFlag integer default 0 not null,  Elevation real default 0.0 not null,Resolution text default '' not null,   GcNote text default '' not null,IsPremium Integer default 0 not null,Guid text default '' not null,FavPoints Integer default 0 not null);
    INSERT INTO Caches_backup SELECT Code, Name, Distance, PlacedBy, Archived, Bearing, CacheId, CacheType, Changed, Container, County, Country, Degrees, Difficulty, DNF, DNFDate, Found,   FoundCount, FoundByMeDate, FTF, HasCorrected, HasTravelBug, HasUserNote, LastFoundDate, LastGPXDate, LastLog, LastUserDate, Latitude, Lock, LongHtm, Longitude, MacroFlag, MacroSort, NumberOfLogs, OwnerId, OwnerName, PlacedDate, ShortHtm, SmartName, SmartOverride, Source, State, Symbol, TempDisabled,   Terrain, UserData, User2, User3, User4, UserFlag, UserNoteDate, UserSort, Watch, IsOwner, LatOriginal, LonOriginal, Created, Status, Color, ChildLoad,   LinkedTo, GetPolyFlag, Elevation, Resolution, GcNote, IsPremium, Guid, FavPoints FROM Caches;
    DROP TABLE Caches;
    CREATE TABLE Caches (Code text default '' not null, Name text default '' not null, Distance real default 0.00 not null, PlacedBy text default '' not null, Archived integer default 0 not null,   Bearing text default '' not null, CacheId text default '1' not null, CacheType text default 'O' not null, Changed text default current_date not null,   Container text default 'Unknown' not null, County text default '' not null, Country text default '' not null, Degrees real default 0.00 not null,   Difficulty real default  1.0 not null, DNF integer default  0 not null, DNFDate text default '' not null, Found integer default  0 not null,   FoundCount integer default  0 not null, FoundByMeDate text default  '' not null, FTF integer default  0 not null, HasCorrected integer default  0 not null,   HasTravelBug integer default  0 not null, HasUserNote integer default 0 not null, LastFoundDate text default '' not null,   LastGPXDate text default '' not null, LastLog text default '' not null, LastUserDate text default current_date  not null, Latitude text default '0.0' not null,   Lock integer default 0 not null,LongHtm integer default 0 not null, Longitude text default '0.0' not null, MacroFlag integer default 0 not null,   MacroSort text default '' not null, NumberOfLogs integer default 0 not null,OwnerId text default '' not null, OwnerName text default '' not null,   PlacedDate text default current_date not null, ShortHtm integer default 0 not null, SmartName text default '' not null,SmartOverride integer default 0 not null,   Source text default '' not null, State text default '' not null, Symbol textdefault '' not null, TempDisabled integer default 0 not null,   Terrain real default 1.0 not null, UserData text default '' not null, User2 text default '' not null, User3 text default '' not null,   User4 text default '' not null, UserFlag integer default 0 not null, UserNoteDate text default  '' not null, UserSort integer default 0 not null,   Watch integer default 0 not null, IsOwner integer default 0 not null, LatOriginal text default '0.0' not null, LonOriginal text default '0.0' not null,   Created text default current_date not null, Status text default 'A' not null, Color text default '' not null, ChildLoad integer default 0 not null,   LinkedTo text default '' not null, GetPolyFlag integer default 0 not null,  Elevation real default 0.0 not null,Resolution text default '' not null,   GcNote text default '' not null,IsPremium Integer default 0 not null,Guid text default '' not null,FavPoints Integer default 0 not null);
    INSERT INTO Caches SELECT Code, Name, Distance, PlacedBy, Archived, Bearing, CacheId, CacheType, Changed, Container, County, Country, Degrees, Difficulty, DNF, DNFDate, Found,   FoundCount, FoundByMeDate, FTF, HasCorrected, HasTravelBug, HasUserNote, LastFoundDate, LastGPXDate, LastLog, LastUserDate, Latitude, Lock, LongHtm, Longitude, MacroFlag, MacroSort, NumberOfLogs, OwnerId, OwnerName, PlacedDate, ShortHtm, SmartName, SmartOverride, Source, State, Symbol, TempDisabled,   Terrain, UserData, User2, User3, User4, UserFlag, UserNoteDate, UserSort, Watch, IsOwner, LatOriginal, LonOriginal, Created, Status, Color, ChildLoad,   LinkedTo, GetPolyFlag, Elevation, Resolution, GcNote, IsPremium, Guid, FavPoints FROM Caches_backup;
    DROP TABLE Caches_backup;
    CREATE UNIQUE INDEX CachesCode ON Caches(code);
    CREATE TRIGGER Delete_Caches DELETE ON Caches
    BEGIN
    delete from logs where lparent = old.code;
    delete from waypoints where cparent = old.code;
    delete from CacheMemo where code = old.code;
    delete from Attributes where acode = old.code;
    delete from Custom where ccode = old.code;
    delete from CacheImages where iCode = old.code;
    END;
    
    CREATE TEMPORARY TABLE CacheImages_backup(iCode text default '' not null, iName iCode text default '' not null, iDescription iCode text default '' not null, iGuid text default '' not null,iImage text default '' not null);
    INSERT INTO CacheImages_backup SELECT iCode, iName, iDescription, iGuid, iImage FROM CacheImages;
    DROP TABLE CacheImages;
    CREATE TABLE CacheImages(iCode text default '' not null, iName iCode text default '' not null, iDescription iCode text default '' not null, iGuid text default '' not null,iImage text default '' not null);
    INSERT INTO CacheImages SELECT iCode, iName, iDescription, iGuid, iImage FROM CacheImages_backup;
    DROP TABLE CacheImages_backup;
    CREATE INDEX CacheImagesI1 ON CacheImages (iCode);
    
    CREATE TEMPORARY TABLE Logs_backup(lParent not null,lLogId integer not null, lType, lBy, lDate date, lLat, lLon, lEncoded boolean, lownerid integer, lHasHtml boolean, lIsowner boolean, lTime text);
    INSERT INTO Logs_backup SELECT lParent,lLogId, lType, lBy, lDate, lLat, lLon, lEncoded, lownerid, lHasHtml, lIsowner, lTime FROM Logs;
    DROP TABLE Logs;
    CREATE TABLE Logs (lParent not null,lLogId integer not null, lType, lBy, lDate date, lLat, lLon, lEncoded boolean, lownerid integer, lHasHtml boolean, lIsowner boolean, lTime text);
    INSERT INTO Logs SELECT lParent,lLogId, lType, lBy, lDate, lLat, lLon, lEncoded, lownerid, lHasHtml, lIsowner, lTime FROM Logs_backup;
    DROP TABLE Logs_backup;
    CREATE UNIQUE INDEX logkey ON logs (lparent,llogid);
    CREATE TRIGGER Delete_Logs Delete ON Logs
    BEGIN
    delete from logmemo where lparent = old.lparent and llogid = old.llogid ;
    delete from LogImages where iCode = old.lparent and ilogid = old.llogid ;
    END;
    
    DROP TABLE OtherApp;
    COMMIT;
  • Datenbank Version von 5006 (GDAK) auf 26 (aktuelle GSAK DB-Version) zurücksetzen
    * GNU Tool DD runterladen http://www.chrysocome.net/dd und ins Verzeichnis kopieren
    * In der Windows Command Line folgenden Code ausführen:
    Code:
    dd.exe if=version.bin of=sqlite.db3 bs=1c seek=60 count=4 conv=notrunc
    Wobei sqlite.db3 wieder die GDAK Datenbankdatei ist und version.bin eine binary Datei mit dem Hex Wert 00 00 00 1A (entspricht 26). Die Datei habe ich mit einem Hex Editor erstellt, z.B. http://hexedit.nextsoft.de/. (Neue Datei. STRG+E und dann den Wert eingeben. Speichern. Fertig.)


Später braucht ihr natürlich nur noch die beiden Befehle in der Command Line eingeben bzw ihr macht euch ein Batch Script dafür.

Das Ganze natürlich ohne Gewähr und auf eigene Gefahr!!! Die ersten Tests scheinen vielversprechend, aber ich hab es noch nicht auf Herz und Nieren getestet!

Grüße,
geggi
 

Team 'zZZz'

Geomaster
Da muss ich ja mal gestehen: Respekt!!! :gott:

Allerdings (und das sage ich jetzt nicht, um Deinen Elan einzudämmen) glaube ich, dass Du den falschen Ansatz wählst. Und zwar: Du rennst jeder Änderung hinterher, die von Seiten GSAKs oder GDAKs an den eigenen, internen Datenbankstrukturen gemacht werden wird ... das geht zwar, aber letztlich wirst Du dieses "Rennen" nie beenden können. :kopfwand:

Warum versuchst Du statt dessen nicht, den Transfer zwischen den Programmen über das "Medium" GPx zu arrangieren? Eine GPx ist definitiv der gemeinsame Nenner zwischen nahezu allen GC-tauglichen Programmen.

Sollten hier SpoilerPics etc das Problem sein? Wohl kaum! Gespiderte Pics in die Dropbox, Referenzen/Links auf die lokalen Settings anpassen, im jeweiligen GPx parsen ... done.

Nur als Vorschlag gedacht ...

Cheers
Dirk
 
OP
G

geggi

Geocacher
Hallo Dirk,

da hast du natürlich vollkommen Recht... Da hat mich gestern eher der Ehrgeiz geweckt.
Und das Problem mit den DB-Updates seitens beider Programme bin ich mir bewusst. Leider gibt es in SQLite kein "ALTER TABLE" wo ich nur die zusätzlichen Spalten droppen könnte, so dass ich den Umweg über eine temporäre Table machen musste. Somit trifft mich aber jede kleine Änderung an der GSAK Datenstruktur (Die GDAK DB ist eher zweitrangig, da ich ja nur die für GSAK interessanten Spalten angeben muss).

Warum ich das Ganze versuche: ich werde demnächst mein iPhone aufgeben und ganz zu Android wechseln (bin grad in der Testphase). Damit geht meine bestehende und bewährte Toolchain von GSAK nach Geosphere (m.E. das beste Programm für Smartphones - leider nur für iOS) verloren und ich muss mir was neues überlegen.

Der Vorteil an der direkten DB-Synchronisierung ist, dass es in wenigen Sekunden erledigt ist, während der GPX-Export aus GSAK deutlich länger dauert (bei etwa 3000 Caches über 1 Minute). Meine GSAK Datenbank liegt bereits auf dem Smartphone, damit ich sie zu Hause und im Büro immer bei mir habe.

Somit wäre es am allerbesten wenn eine Smartphone-App direkt 1:1 auf diese DB zugreifen würde (schreiben und lesen). Damit wäre die ganze Synchronisation mit all ihren Problemen und der nötigen Umwandlungs-/Exportzeit überflüssig. Da klang der GDAK-Ansatz ganz vernünftig, aber wie es sich herausstellt, ist es eben doch nicht und der Teufel liegt im Detail...

geggi
 

Team 'zZZz'

Geomaster
Hallo greggi,

ist es dann vielleicht doch eher so wie ich vermute ... die GSAK-DB ist der "leading record" und GDAK soll einfach nur ein Abbild sein? Denn on-the-hunt wirst du kaum Aktualisierungen in der GDAK-DB vornehmen, oder?

Na, da kann man dann doch gaaaaaanz nach dem kiss-Prinzip (keep-it-simple-stupid) verfahren? :???:

Synchronisiere die GSAK-DB auf dem Smartphone via Dropbox in ein Extraverzeichnis und kopiere bei Bedarf aus diesem Verzeichnis in das GDAK-Verzeichnis hinein. Kostet Dich vor jedem Start ca.5 klicks mehr, Du bist auf dem aktuellen Stand und schon kann es losgehen.

Oder war das jetzt zu einfach gedacht?

Cheers
Dirk
 
Oben