German [solved] Tabelle kann in Datenbank nicht gefunden werden

Parsec

Member
Licensed User
Longtime User
Hallo Gemeinde,
habe eine Problem das eine Tabelle in einer SQLite Datenbank nicht gefunden werden kann. Ich hoffe auf eure Hilfe.

Wo ist mein Fehler?

Hier die Daten:

B4A Version: 9.50
Java Version: 8
Parse den Code. (0.01s)
Building folders structure. (0.03s)
Kompiliere den Code. (0.03s)
Kompiliere Layoutcode. (0.01s)
Kompiliere Debugger-Code (0.01s)
Vorherige erfolgreiche Shell-App ausführen (0.00s)
Erfolgreich abgeschlossen.



upload_2019-9-18_17-56-4.png



#Region Activity Attributes
#FullScreen: False
#IncludeTitle: True
#End Region

Sub Process_Globals
'These global variables will be declared once when the application starts.
'These variables can be accessed from all modules.

Public SQL1 As SQL

End Sub

Sub Globals
'These global variables will be redeclared each time the activity is created.
'These variables can only be accessed from this module.

Private imgNeuerMandant As ImageView
Private imgPlus As ImageView
Private imgPfeil_Zurueck As ImageView
Private lblUeberschrift As Label
Private ListView1 As ListView
Private EditText1 As EditText

End Sub

Sub Activity_Create(FirstTime As Boolean)

Activity.LoadLayout("NeuerMandant")
imgNeuerMandant.Bitmap = LoadBitmap(File.DirAssets , "NeuerMandant_32.png")
imgPlus.Bitmap = LoadBitmap(File.DirAssets , "edit-add-48.png")
imgPfeil_Zurueck.Bitmap = LoadBitmap(File.DirAssets , "Pfeil_Zurueck.png")


ListView1.Initialize("ListView1")
Dim GD As GradientDrawable
GD.Initialize("TR_BL", Array As Int(Colors.White , Colors.LightGray))
Activity.Background = GD
ListView1.ScrollingBackgroundColor = Colors.Transparent
'Dim Bitmap1 As Bitmap
ListView1.SingleLineLayout.ItemHeight = 50dip
ListView1.SingleLineLayout.Label.TextSize = 20
ListView1.SingleLineLayout.Label.TextColor = Colors.Black
ListView1.SingleLineLayout.Label.Gravity = Gravity.FILL
ListView1.FastScrollEnabled = True

' Next
Activity.AddView(ListView1, 0, 260, 100%x, 30%y)

If FirstTime Then

SQL1.Initialize(File.DirInternal, "zerfa.db", True)

End If

'initialize the variables
'CurrentIndex = -1
'Edit.Mode = "Add"

VorhandeneMandaten_Laden

End Sub


Sub VorhandeneMandaten_Laden

Dim rs As ResultSet
Dim s As Int = 0

Try

rs = SQL1.ExecQuery("SELECT * FROM tabelle") <- Hier wird eine Exception geschmissen

Do While rs.NextRow

'ResultSet1.NextRow
s = s +1

Loop

Catch

ToastMessageShow(LastException, False)

Log(LastException)

End Try

rs.Close

End Sub

Protokoll:
upload_2019-9-18_17-50-40.png


Die Datenbank habe ich mit
DB Browser für SQLite
erstellt.
Version 3.11.2
Erstellt für i386-little_endian-ilp32, running on x86_64
Qt-Version 5.7.1
SQLite-Version 3.27.2
 

klaus

Expert
Licensed User
Longtime User
Du initialisierst die Datenbank in SQL1.Initialize(File.DirInternal, "zerfa.db", True).
Aber die Datenbank befindet sich in File.DirAssets !!!
Du musst die Datenbank, zu mindes ein mal, von File.DirAssets nach File.DirInternal kopieren!
B4X:
If FirstTime Then
    If File.Exists(File.DirInternal, "zerfa.db") = False Then
        File.Copy(File.DirAssets, "zerfa.db", File.DirInternal, "zerfa.db")
    End If
    SQL1.Initialize(File.DirInternal, "zerfa.db", True
End If
 

Parsec

Member
Licensed User
Longtime User
Hallo Helfer,
danke für eure schnelle Antwort.
Da ich ein alsoluter Neuling in Sachen Forum bin entschuldige meine unbeholfene Art.
Jeder Tip hilft.

Ich gelobe Besserung.

Wenn ich noch irgendetwas vergessen habe, einfach sagen. Ich liefere.

Also hier mein Listing:
 

Attachments

  • zerfa.zip
    102.7 KB · Views: 327

Parsec

Member
Licensed User
Longtime User
Hallo Klaus, weil in Post#2 nach dem "testproject" gefragt wurde, habe ich das Listing gepostet.
Ich sitze jetzt schon 2 Tage an diesem Fehler und habe im Internet recherchiert.
Der Fehler wird aber in diesem Projekt erzeugt.
Im Grunde erwarte ich nur einen Tip, wo der Fehler sitzen könnte um ihn selber zu beseitigen.
 

Parsec

Member
Licensed User
Longtime User
Hallo Klaus,
habe von einem deiner Kollegen Hilfe bekommen.
Der hatte sich die Zeit genommen mir das kurz zu erklären.
Danke nochmals für eure Hilfe
 

pucki

Active Member
Licensed User
Longtime User
Erst einmal überprüfe deine Datenbank. Ich persönlich liebe dieses PC Programm.
https://sqlitestudio.pl/index.rvt

Das Teil ist Freeware, mit bitte zur Spende.

-----------------------------------------------------------------------------------------------

Die Ini-Code Anweisung ist meiner Meinung nach Falsch.

SQL1.Initialize(File.DirInternal, "zerfa.db", True) <- TRUE sagt das die DB angelegt wird, wenn sie nicht da ist. Die DATENBANK aber NICHT die Tabelle(n) !!!!

Das ändern der Datenbank-Struktur durch die Anwendung ist i.d.R. sehr selten. Normalerweise hat eine Anwendung eine Datenbank mit festen Tabellen / Feldern.
Der User also nur lesen und schreiben von Daten aus/in die Datenbank kann.

Also mache folgendes.
Lade die den SQL-Manager runter. (sieh Link) Erstelle damit deine Datenbank und die nötigen Tabellen mit Feldern und was du sonst noch brauchst.
Prüfe im Debug-Mode was für eine Wert "File.DirInternal" rauswirft.

Kopiere die dann auf das Android-Teil in genau das Verzeichnis und ändere dein Code in. SQL1.Initialize(File.DirInternal, "zerfa.db", FALSE)

Das wars. Ist jedenfalls das Verfahren wie ich das mache, und das funktioniert prima. (Bei inzwischen 4 unterschiedlichen Programmen)


Edit: rs = SQL1.ExecQuery("SELECT * FROM tabelle") <- Hier wird eine Exception geschmissen

Der Befehl sagt, setze den Pointer in der Tabelle mit den Namen "tabelle" auf die erste Position die die Bedingung (bei dir keine) erfüllt.

Man sollte wegen der Übersichtlichkeit aber niemals eine Tabelle "tabelle" nennen. Ich nenne so Sammel-Tabellen ohne Zweckbindung immer DATEN.


Gruß

Pucki
 
Last edited:

Parsec

Member
Licensed User
Longtime User
Danke Pucki.
Habe es so gemacht und es läuft.
Ich Programmiere seit Jahren in VB und mit Backend MS Access.
Das mit der 'tabelle' war nur zu Versuchzwecken. Hatte nach jeder Möglichkeit gesucht den Fehler zu finden und glaubte am Schluß fast an Geister. :)
Naja jetzt funzt es ja.

Bis dahin

Parsec
 

pucki

Active Member
Licensed User
Longtime User
Ich auch. Allerdings musste ich für einige meiner Privaten Datenbanken auf SQLite wechseln, da Access keine Datenbank sondern eine Adressverwaltung ist.
So ab 1. Mio Datensätze hast du damit richtig Stress.

Aber schön das es läuft.

Gruß

Pucki
 

Parsec

Member
Licensed User
Longtime User
Ah gut zu wissen. Bin Gott sei Dank noch nie soweit vorgestoßen (1. Mio Datensätze)
 

pucki

Active Member
Licensed User
Longtime User
Meine größte am PC hat 4,6 Mio. Aber davon tue ich nur einen kleinen Teil von, auf das Handy.

So Größen passieren, wenn man alte Daten in einer Datenbank hat, die man eigentlich nicht braucht, aber zu Recherche-Zwecken vorhalten will.
Ich drücke dann in den PC-Prg. auf ein Button und das System erstellt die Datenbank mit den aktuellen Datensätzen. Die kopiere ich aufs Tablett dann. Bleiben dann nur noch so ca. 30.000-40.000 übrig. ;)

Wobei das Problem bei Access ein Doppeltes ist. Der hat ein Problem mit 2 GB-Dateigröße.
Du kannst dir also groß Ausrechnen wie viele Datensätze du in den DATENBANK tust. Ob du in der DB 1 oder mehrere Tabellen benutzt ist relativ unwichtig.

Davon abgesehen sind Abfragen damit eine Qual.

Gruß

Pucki
 
Top