German Wo kann ich ein Prg. initialisieren

pucki

Active Member
Licensed User
Ich habe ein komischen Fehler.

Ich muss einige List-View's mit Daten füllen, BEVOR die App bereit ist. Diese Daten kommen aus einer SQL- Abfrage mit folgenden Code.
B4X:
Sub Activity_Create(FirstTime As Boolean)
  prg_ini ' aufruf der Sub
end sub

sub prg_ini
    Dim sql_abfrage As String
    Dim posi As Cursor
        
    sql_abfrage = "SELECT * FROM Daten WHERE code = 'Titel' and aktiv ='" & aktiv_status & "'"
    posi = my_sql.ExecQuery(sql_abfrage)
        For i = 0 To posi.RowCount - 1
        posi.Position = i
        hp_l_liste.AddSingleLine(posi.GetString("Titel"))
    Next
end sub

Dieser Code läuft, aber der Debugger schmeist mich mit Fehlermeldungen zu. Allerdings nur im RELEASE-MODE mit eingeschalteten Debugger. Im DEBUG-MODUS hängt es. (Weisser Bildschirm auf den Tablett) KEINE Fehlermeldung in der B4X.


WAS MACHE ICH FALSCH. Und wo oder wie kann ich das richtig machen.

Gruß

Pucki
 

DonManfred

Expert
Licensed User
Longtime User
Allerdings nur im RELEASE-MODE mit eingeschalteten Debugger
???

Im Release compilation ist kein Debugger aktiv. Der ist nur bei Debug-Compilation aktiv.

Dieser Code läuft, aber der Debugger schmeist mich mit Fehlermeldungen zu.
Diese hier NICHT zu posten ist sicher eine super Idee?

Hat sql nicht auch async methods? Wenn ja, dann solltest Du diese verwenden in verbindung mit Wait for.

Edit to add:
 

pucki

Active Member
Licensed User
Release-Mode mit Debugger geht. !!!
Du musst nur folgendes einstellen.

B4X:
#Region  Project Attributes
    #ApplicationLabel: Daten
    #VersionCode: 1
    #VersionName:
    #BridgeLogger : true  ' <- DIES LÖST DEN DEBUGGER AUS. Steht im Protokoll-Fenster irgendwo.
     #SupportedOrientations: unspecified
    #CanInstallToExternalStorage: False
#End Region

**** Fehlermeldung

B4X:
main_sub_prg_one_line (java line: 1001)
android.database.sqlite.SQLiteException: no such table: Daten (code 1): , while compiling: SELECT * FROM Daten WHERE Status = 'aktiv' order by Titel
#################################################################
Error Code : 1 (SQLITE_ERROR)
Caused By : SQL(query) error or missing database.
    (no such table: Serie (code 1): , while compiling: SELECT * FROM Daten WHERE Status = 'aktiv' order by Titel)
#################################################################
    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1221)
    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:695)
    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:59)
    at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
    at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:46)
    at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1849)
    at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1788)
    at anywheresoftware.b4a.sql.SQL.ExecQuery2(SQL.java:223)
    at anywheresoftware.b4a.sql.SQL.ExecQuery(SQL.java:211)
    at b4a.serie_sql.main._sub_prg_one_line(main.java:1001)
    at b4a.serie_sql.main._activity_create(main.java:463)
    at java.lang.reflect.Method.invoke(Native Method)
    at anywheresoftware.b4a.BA.raiseEvent2(BA.java:196)
    at b4a.serie_sql.main.afterFirstLayout(main.java:104)
    at b4a.serie_sql.main.access$000(main.java:17)
    at b4a.serie_sql.main$WaitForLayout.run(main.java:82)
    at android.os.Handler.handleCallback(Handler.java:790)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:7000)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:441)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)

Da das Prg. selbst sauber läuft, denke ich das der Fehler darin liegt, das ich die PRG_INI Sub zu früh aufrufe. Aber das ist nur ein Verdacht.


Mir stellt sich die Frage ob es eine "Activity_start" gibt, die NACH Activity_Create als erste aufgerufen wird, und die View's mit Daten füllt.

Gruß

Pucki
 

DonManfred

Expert
Licensed User
Longtime User
Du musst nur folgendes einstellen.
Dazu müsste ich die Bridge nutzen. Ich habe das Device i.d.R per USB angeschlossen und brauche die Bridge nicht.

Hinzu kommt das ich im normalfall immer im Release-Mode arbeite. Wenn ein Fehler auftritt dann crasht es halt und ich sehe die Fehlermeldung im Log.
Debug-Mode habe ich in den 6 Jahren B4A vielleicht zwei oder dreimal benutzt.

Mir stellt sich die Frage ob es eine "Activity_start" gibt, die NACH Activity_Create als erste aufgerufen wird, und die View's mit Daten füllt.
Nach Activity_create wird ein- oder mehrfach Activity_resume aufgerufen. Die Daten sollte man aber in CREATE laden. Und nicht nur, wenn FirstTime true ist,

 

pucki

Active Member
Licensed User
Das erklärt aber immer noch nicht meine "falsche" Fehlermeldung. Immerhin läuft das Teil perfekt. Bloß beim Compilieren gibt es diesen Fehler. Und das sogar doppelt weil ich 2 SQL-Datenbanken benutzen muss.

Praktisch behauptet er er findet die Datenbank/Tabelle nicht. Sie ist aber da. !!! Sonst könnte er ja keine Daten lesen, wenn ich es starte.

Ach ja, habe ich fast vergessen. Als ich das Prg. entwickelt habe unter 7.30 hatte ich diese Fehlermeldung nicht.
Die tritt erst jetzt auf bei der 9.50. :rolleyes:

Gruß

Pucki
 
Last edited:

pucki

Active Member
Licensed User
Wie wird SQL initialisiert?
Was ist der Package Name in Build Configuration (Projekt Konfiguration)?

Wie wird SQL initialisiert? So : my_sql.Initialize(File.DirRootExternal, "daten_sql.db", False)

Was ist der Package Name in Build Configuration (Projekt Konfiguration)? b4a.daten_sql

Es läuft ja, das ist ja der Witz, nur die Fehlermeldungen beim erstellen nerven etwas. Bei der alten 7.3 Version mit der ich das Teil entwickelt habe, gab es den Fehler nicht.
Der Fehler trat erst mit der neusten Version (9.5) auf. Und zwar OHNE das ich was am Code geändert habe. Allerdings mit einer älteren SDK-Version (19) im Manifest-Editor



aktueller Manifest-editor:
'This code will be applied to the manifest file during compilation.
'You do not need to modify it in most cases.
'See this link for for more information: https://www.b4x.com/forum/showthread.php?p=78136
AddManifestText(
<uses-sdk android:minSdkVersion="5" android:targetSdkVersion="26"/>  ' <- geändert von 19 auf aktuell 26
<supports-screens android:largeScreens="true"
    android:normalScreens="true"
    android:smallScreens="true"
    android:anyDensity="true"/>)
SetApplicationAttribute(android:icon, "@drawable/icon")
SetApplicationAttribute(android:label, "$LABEL$")
'End of default text.


Kleine Neben-Info. Das ganze wird auf ein AMD-Rechner entwickelt. Das Android-Zeug ist mit den SDK-Manager von Android auf den neusten Stand gebracht worden.


Gruß

Pucki
 

DonManfred

Expert
Licensed User
Longtime User
So : my_sql.Initialize(File.DirRootExternal, "daten_sql.db", False)
Und du requestest die Permission mit runtimepermission und hast eine ERFOLGREICHE Permission (Success = True beim Permissionrequest) bevor Du den Code so benutzt?

Du hast mit targetsdk 26 KEINEN ZUGRIFF auf File.DirRootExternal ohne vorher die Permission mittels Runtimepermissions angefordert zu haben.

FAKT ist, das die (Google) Regeln sich mit targetsdk 26 gegenüber 19 DEUTLICH verändert haben! Unglücklicherweise gebe ich zu; ist aber nunmal so.

Es ist NOTWENDIG dein Problem auf den aktuellen Stand der Dinge zu bringen. Und das heisst dass Du die neuen Regeln einhalten musst.

Starte erstmal mit einem kleinen Testprojekt.
Ich bin sicher dass es irgendwo ein SQL Beispiel gibt welches targetsk 26 tauglich ist. Musst Du mal das Forum durchsuchen...
 

pucki

Active Member
Licensed User
O.K. Das erklärt einiges.

Muss ich halt man die Rechte nachbessern. ;)

Witziger weise funktioniert es ja auf den Tablett. Muss ich halt mal suchen wie ich die Schreib/Leserechte bekomme. Ist nämlich so praktisch die Datei direkt auf die "Hauptebene" im Tablett zu schreiben. Wobei mir die Speicherkarte (die echte SD-Karte) sogar lieber wäre. Aber die funktioniert absolut nicht bei SQL-Dateien. Selbst wenn ich den Pfad als String übergebe.

Ich gebe zu das ich mich mit den "neuen" Regeln von SDK-26 noch nicht beschäftigt habe. Da das Prg. sowieso nur für mich ist, ist das eh Wurst solange es läuft.

Ich danke dir jedenfalls für deine Hilfe. Nun muss ich nur noch raus finden was ich in den Mainfest-editor schreiben muss damit ich wieder Zugriff bekomme.

Gruß

Pucki
 

pucki

Active Member
Licensed User
Nachtrag :

Ich habe nun die 2 Zeilen in den Manifest-Editor getan und alles ist fein.

Manifest-editor:
AddPermission(android.permission.WRITE_EXTERNAL_STORAGE)
AddPermission(android.permission.READ_EXTERNAL_STORAGE)

Danke für den Tipp. Wäre ich vermutlich nie drauf gekommen.

Gruß

Pucki
 
Top