German Returncodes in SQL Library verfügbar? (Grundsätzliches Verständnis)

ChrisS

Member
Licensed User
Longtime User
Hallo liebes Forum, hallo liebe Community,

ich hoffe für meine erste Frage ist sie nicht zu dumm,
aber ich mache gerade die ersten Schritte bin soweit auch schwer begeistert,
aber scheine mich aufgrund flascher Annahmen im Kreis zu drehen.

Daher entschuldigt, wenn das für einen Profi "doch ganz klar!" ist...

Mein Ziel wäre es beim Create der Activity zu prüfen ob eine Datenbank
existiert und in Ihr entsprechende Tabellen...oder ob die Tabellen erst noch angelegt werden müssen.

Gut, soweit habe ich das verstanden dafür gibt es im Tutorial den TRUE Parameter um die Datenbank bzw. deren Datei im Bedarfsfall zu erstellen.

--- Soweit alles verstanden

Ich möchte jetzt auf Tabellen innerhalb der Datenbank prüfen.

Normalerweise würde ich mir das Rückgabeergebnis eines SELECTs auf einen willkürlich gewählten Tabellennamen auf wahr oder falsch prüfen.

Was mich nun irritiert ist, daß es anscheinend keine Returncodes gibt, sondern nur Zeiger "Cursor" welche auf Daten zeigen.

------
Meine Frage wäre:

Wie prüft man auf das vorhanden sein von Tabelen innerhalb einer existierenden Datenbank?
------
Das ganze möchte ich wissen weil: sofern die Funktionaliät irgendwann einmal
erweitert werden sollte, weitere Tabellen hinzukommen KÖNNTEN.
Das würde vom benutzerspezifischen Einsatzgebiet abhängen.

Ich muss also zwangsläufig prüfen was überhaupt vorhanden ist und was nicht, um entsprechend reagieren zu können.
------

Mir wurde bisher immer eingebläut Fehlerbehandlungen einzubauen,
um exceptions abfangen zu können.

Aber wie geht das wenn ich garkeine Returncodes habe?

Hoffe ich stelle mich nicht zu dumm an...

Würde mich über einen kleinen Tipp oder etwas Starthilfe sehr freuen.

Lieber Gruß
ChrisS
 

ChrisS

Member
Licensed User
Longtime User
mmh, also ich würde denken das es so ähnlich aussehen könnte wenn man keine Returncodes hat.

Aber die angelegte DB bleibt auf 0KB.

B4X:
Sub Activity_Create(FirstTime As Boolean)

SQL1.Initialize(File.DirDefaultExternal, "meinedb.db", True)

SQL1.ExecQuery("CREATE TABLE IF NOT EXISTS kontakte (name TEXT , vorname TEXT, telefonnummer TEXT)")

End Sub
 

ChrisS

Member
Licensed User
Longtime User
So liebe Community....

mein Beginneransatz welcher nun auch zu funktionieren scheint wäre:

B4X:
Sub Activity_Create(FirstTime As Boolean)

SQL1.Initialize(File.DirDefaultExternal, "meinedb.db", True)

SQL1.SQL1.ExecNonQuery("CREATE TABLE IF NOT EXISTS kontakte (name TEXT , vorname TEXT, telefonnummer TEXT)")

End Sub

So, und nun würde ich gern von einem etwas versierten b4a Nutzer wissen:
- Gibt es Errorcodes und wie fängt man diese ab? Bzw. wie kann man Fehler behandeln?
- Ich habe die If abfrage bezgl. FirstTiime aus dem Beispiel/Tutorial entfernt weil mir dies redundant erschien durch das TRUE. Vielleicht fehlt mir eine Info?

Lieber Gruß
ChrisS
 
D

Deleted member 103

Guest
Hallo ChrisS,

schau dir mein Beispiel an, das könnte eine kleine Start-Hilfe sein.
B4X:
Sub Activity_Create(FirstTime As Boolean)
   If FirstTime Then
      If Not(File.Exists(File.DirDefaultExternal, "meinedb.db")) Then
         If File.Exists(File.DirAssets ,"meinedb.db") Then
            File.Copy(File.DirAssets ,"meinedb.db",File.DirDefaultExternal, "meinedb.db")
               SQL1.Initialize(File.DirDefaultExternal, "meinedb.db", False)
         Else
            SQL1.Initialize(File.DirDefaultExternal, "meinedb.db", True)
            ' Tebelle erstellen
            SQL1.SQL1.ExecNonQuery("CREATE TABLE kontakte (name TEXT , vorname TEXT, telefonnummer TEXT)")
         End If
      Else
            SQL1.Initialize(File.DirDefaultExternal, "meinedb.db", False)
      End If
    End If
End Sub

Sub ExistSqlTable(Table As String) As Boolean
   Dim exist As Boolean
   exist=False
   Cursor=SQL1.ExecQuery("SELECT name FROM sqlite_master WHERE type = 'table'")
   For i = 0 To Cursor.RowCount - 1
      Cursor.Position = i
      If Table.EqualsIgnoreCase(Cursor.GetString2(0)) Then
         exist= True
         Exit
      End If
   Next
   Cursor.Close
   Return exist
End Sub

Ciao,
Filippo
 

klaus

Expert
Licensed User
Longtime User
Willkommen in dieser 'Gemeinde'.

Hast Du schon mal in den Beginner's Guide reingeschaut, da hast Du ein komplettes SQL Beispiel mit Erklährungen und Sourcecode drin, aber nur in Englisch.

Leider sind die 'Codesnippets' die Du sendest zu unvollständig um konkrete Ratschläge geben zu können.

Ein Paar Fragen:
Wo definierst Du Dim SQL1 ?
Bist Du sicher dass Du eine Datenbank in File.DefaultExternal hast ?
Wenn nein, stellt Dein Code eine neue her und die ist natürlcich leer.
Wenn Du aber schon eine hast kannst Du die in den Files Ordner im IDE einlesen, musst sie dann aber von diesem Ordner in einen anderen kopieren. Das ist Alles im Beispiel im Beginner's Guide erklärt.

Zu Deinem Code, der letzte kann nicht funktionieren denn
SQL1.SQL1.Exec... kann nicht funktioneiren, denn zwei mal die Referenz.
- Ich habe die If abfrage bezgl. FirstTiime aus dem Beispiel/Tutorial entfernt weil mir dies redundant erschien durch das TRUE. Vielleicht fehlt mir eine Info?
Wenn das so gemacht wurde hat es bestimmt seine Gründe :).
Ich schlage Dir vor dieses Tutotorial, Android Prozesse und Activities Lebensdauer, in Tiefe durchzulesen damit Du verstehst wie Android funktioniert, es ist nähmlich ziemlich unterschiedlich von Windows oder WindowsMobile. Und auch diese Ratschläge. Und die sind in Deutsch.

Für weitere Fragen sind wir immer da.
Es ist immer vorteilhaft, für Fragen, das Projekt als zip Datei zu posten (im IDE Menü Files/Export As Zip) denn dann können wir sehen was gemacht wurde, was falsch ist, was man eventuell verbessern könnte und können es noch in genau den gleichen Bedingungen wie Du testen.

Eine Art von ErrorTrap gibt es hier Try / Catch.



Beste Grüsse.
 

ChrisS

Member
Licensed User
Longtime User
Vielen Dank Ihr Beiden,

@Klaus: Hallo Klaus, ich bezog mich mehrfach auf das SQL - Tutorial (welches von Dir gepostet bzw verlinkt wurde).

Ich glaube Du hast übersehen daß das letzte Beispiel nicht von mir sondern von Filippo kam. :)

Gut, ich habe mir den Link über die Lebenszeit der Processe/Activities angesehen, und verstehe nun tatsächlich etwas mehr.

Bitte korrigiere mich wenn folgendes falsch ist:

FirstTime sorgt in dem Fall eines Activity-Neustarts dafür, daß die Datenbank NICHT neu initialisiert wird ? Hier werden also einfach Ressourcen gespart weil die Neuinitialisierung überflüssig wäre da der Process noch läuft. richtig?

Ich habe jetzt trotzdem noch eine Frage:

Ich beziehe mich auf dein deutsches SQL Tutorial unter:
http://www.b4x.com/forum/german-tutorials/7461-sql-tutorial.html#post42506

B4X:
... 
Sub Process_Globals
    Dim SQL1 As SQL
End Sub
...

Ich dachte eigentlich ich hätte es verstanden, aber wenn wir SQL1 Global definieren, dann wäre die Chance bei Paralelbetrieb mit anderen datenbankgestützten Prozessen/Activities relativ hoch daß jemand vielleicht auch SQL1 benutzt, was wohl sehr suboptimal wäre. Da würden Variablen ja von fremden Processen überschrieben werden können... SQL1 ist nicht unbedingt besonders abstract.

Warum wird in Process_Globals definiert und nicht in Sub Globals. Ich hatte es so verstanden das Sub Process_Globals auch für andere Prozesse zu Verfügung steht.....

Es ist also falsch, daß Dims im Sub Process_Globals ... Superglobal (also Anwendungsübergreifend) zu verfügung stehen?

Gut, aber bevor ich mich weit aus dem Fenster hänge sollte ich erstmal lernen... ;)

Danke für die Tipps.

PS.: Dein Nachnahme beginnt nicht zufällig mit L. oder?


@Filipo: Danke!
Solche Beispiele sind selbst wenn sie vielleicht etwas Buggy sind als Anwendungsdemo sehr erklärend... weil sie eine mögliche Herangehensweise aufzeigen.

Vielen Dank dafür.

Lieber Gruß
ChrisS
 
Last edited:

klaus

Expert
Licensed User
Longtime User
Ich glaube Du hast übersehen daß das letzte Beispiel nicht von mir sondern von Filippo kam.
Nein, das bezog sich auf den Code im Post#3 wo SQL1.SQL1.ExecNonQuery... steht. Ich hatte Filippos Post erst gesehen nachdem Ich meines geschickt hatte.

@Filipo: Danke!
Solche Beispiele sind selbst wenn sie vielleicht etwas Buggy sind
Wenn sich das auf meine Bemerkung betzieht, hat es keinen Grund, da die sich auf den Code im Post#3 bezieht.

FirstTime: Die Lebensdauer der Activities wird vom Betriebssystem behandelt, die Activities können wenn sie im Hintergrund 'Pause' sind, je nach Speicher Bedarf, im Hintergrund bleiben oder gelöscht werden. Wenn eine Activity aus dem Hintergrund in den Vordergrund hervorgerufen wird ist FirtsTime = False. Wenn die Activity aber schon, vom OS, gelöscht wurde und wieder gebraucht wird ist FirstTime = True.

Process_Globals: Variablen oder Objekte die in dieser Routine deklariert sind, sind gültig solange dieser Prozess am Leben ist.
Wenn der Benutzer, zum Beispiel, das Gerät dreht wird die aktuelle Activity in den Hintergrund 'Pause' gestellt (Activity_Pause wird aufgerufen UserClosed = False) und dann, mit den neuen Bildschirmbedingungen, wieder neu erstellt. In diesem Fall wird Process_Globals NICHT aufgerufen, Globals JA, Activity_Create JA aber FirstTime = False und Activity_Reume JA. Das gleiche passiert auch wenn man eine andere Activity aufruft, das ist aber Alles im gleichen Prozess.
Das heisst dass, jedesmal wenn Globals aufgerufen wird, alle Objekte und Variablen neu erstellt werden.
In Process_Globals deklariert man alle Variablen die man über Activities hinaus beibehalten will und einige Objekte wie Timer, SQL oder GPS die nicht direkt mit einer Activity verbunden sind.

Es ist also falsch, daß Dims im Sub Process_Globals ... Superglobal (also Anwendungsübergreifend) zu verfügung stehen?
Supergloabal, über Activities hinaus: Ja
Anwendungsübergreifend: Nein, eine Anwendung ist ein Prozess.

PS.: Dein Nachnahme beginnt nicht zufällig mit L. oder?
Nein, mein voller Name ist kein Geheimniss: Klaus CHRISTL.

Beste Grüsse.
 

ChrisS

Member
Licensed User
Longtime User
Danke Klaus,

das hilft weiter....

Hihi, mit etwas Buggy meinte ich eigentlich Filippo, weil ich tatsächlich nicht gemerkt habe daß der Bug aus meinem eigenen Post stammte... der Wald vor lauter Bäumen...

Ich glaube als "frisch konfriontierter" muss man erstmal einen Überblick bekommen...

Ich danke Dir jedenfalls für jede Hilfe die Du gibst auch wenn ich momentan noch etwas kaotisch wirke, das ist meine Art mich mit Gewalt in ein Thema zu wühlen... und ich bin ja gottseidank lernfähig.

Ich danke Dir!

Ich glaube es wird dann langsam auch offtopic.

Falls hier im Forum überhaupt geclosed wird, kann der Thread von meiner Seite her geclosed werden.

Lieber Gruß
und danke für die Starthilfe, ich werde bestimmt noch 1000 mal fragen bevor ich genügend weiß um anderen ebenfalls helfen zu können...

Ich wünsche Euch frohe Weihnachtstage und einen guten Rutsch ins neue Jahr!

ChrisS
 
D

Deleted member 103

Guest
Hallo ChrisS,

@Filipo: Danke!
Solche Beispiele sind selbst wenn sie vielleicht etwas Buggy sind als Anwendungsdemo sehr erklärend... weil sie eine mögliche Herangehensweise aufzeigen.
ich bitte um entschuldigung. Ich habe die Zeile,
B4X:
SQL1.SQL1.ExecNonQuery("CREATE TABLE IF NOT EXISTS kontakte (name TEXT , vorname TEXT, telefonnummer TEXT)")
ohne auf die korrektheit zu prüfen, einfach in mein Beispiel übernommen.

Ciao,
Filippo
 

ChrisS

Member
Licensed User
Longtime User
@Filippo
Das weiß ich, und Du brauchst Dich für meine Fehler nicht entschuldigen.... :)

Ich finde es sehr nett das Du die Zeile überhaupt in das Beispiel eigebaut hast, um mir zu zeigen wie es funktionieren könnte.

Ich programmiere in Visual Basic, PHP, Javascript, C++ (Processing / Arduinio), sowie als Beschreibungssprachen CSS und HTML... und jetzt auchnoch bald (so hoffe ich) Basic4Android in den Grundzügen....

Ich muß sowieso ständig abstrahieren und umdenken... "kleine Differenzen" zueinander gibt es ja überall....

ich habe die Aussage des Sourcecodes verstanden und darauf kommt es ja an...

Ich meinte das also schon ernst mit dem Dank! :)

Lieber Gruß und frohe Weihnachten!!!
ChrisS
 
Top