German File.ReadList , wo ist der Fehler?

kollimann

Member
Licensed User
Longtime User
Hallo
ein kurzer Code, beim ersten Start alles OK, beim 2. Start Fehler Zeile 57

java.lang.IndexOutOfBoundsException: Invalid index 2, size is 0

Also beim 1.Start wird ja die Datei mit der List erszeugt, da geht alles, wenn die Datei vorhanden wird ja draus gelesen, da gehts nicht mehr. Keine Ahnung warum. Datei ist vorhanden und geschrieben.
B4X:
#Region  Project Attributes
    #ApplicationLabel: B4A Example
    #VersionCode: 1
    #VersionName:
    'SupportedOrientations possible values: unspecified, landscape or portrait.
    #SupportedOrientations: unspecified
    #CanInstallToExternalStorage: False
#End Region

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

Sub Process_Globals
Type Fahrer(ID As String, Name As String, Auto As String, Lap As String, LapTime1 As String, LapTime2 As String, BestLap As String, Bild As String)
Dim register As Fahrer
Dim FahrerList As List
End Sub

Sub Globals
    Dim Button1 As Button
    Dim Button2 As Button
End Sub
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("1")
If File.Exists (File.DirDefaultExternal, "fahrer.txt") = False Then
    register.Initialize
    FahrerList.Initialize
        For i = 1 To 7
            Dim register As Fahrer
            register.ID = "#" & (i)
            If i < 7 Then
            register.Name = "Fahrer " & (i)
            Else
            register.Name = "GhostCar"
            End If
        FahrerList.Add(register)
        Next
            File.WriteList(File.DirDefaultExternal, "fahrer.txt", FahrerList)
    Else
        FahrerList = File.ReadList(File.DirDefaultExternal, "fahrer.txt")
        register.Initialize
        FahrerList.Initialize
    End If
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause(UserClosed As Boolean)

End Sub
Sub Button1_Click
Dim register As Fahrer
register = FahrerList.get(2)    ' hier Fehler
Log("Name " & register.Name)
End Sub

Danke Heiko
 

DonManfred

Expert
Licensed User
Longtime User
File.Writelist macht aus dem inhalt STRINGS. Siehe Doku!
https://www.b4x.com/android/forum/pages/results/?query=file.writelist

Für deine Zwecke solltest Du RandomaccessFile benutzen und das ganze mittels raf.Writeb4xObject in eine Datei schreiben.
Nur hier kannst Du eine Map oder eine List wie die deine schreiben und auch wieder korrekt laden.

Siehe auch hier: https://www.b4x.com/android/forum/threads/b4xobject-b4a-b4j-b4i-objects-serialization.48272/#content

Vorteil hier ist, dass das ganze auch mit b4j und b4i kompatibel ist.

The following types are supported by WriteB4XObject:
Lists, Maps, String, primitives, user defined types and arrays. Only arrays of bytes and arrays of objects are supported (in B4A and B4J).
Including combinations of these types (a list that holds maps for example).
 

An Schi

Well-Known Member
Licensed User
Kann der Fehler daher kommen, dass du nach FahrerList = readlist nochmals FahrerList.initialize hast?
 

kollimann

Member
Licensed User
Longtime User
Kann der Fehler daher kommen, dass du nach FahrerList = readlist nochmals FahrerList.initialize hast?

Ja, hab ich bemerkt und das weg gemacht, neuer Fehler gleiche Stelle
java.lang.ClassCastException: java.lang.String cannot be cast to b4a.example.main$_fahrer

nu wirds immer verrückter für mich.

@DonManfred.....dazu werd ich mich belesen.....Danke
 

kollimann

Member
Licensed User
Longtime User
@DonManfred
Also dein Ratschlag, Writeb4xObject zu nutzen den hab ich so in etwa nun genommen, und das funktioniert sauber.
Leider gibts in meine B4A uralt Version nur WriteObject, aber das funktioniert für meine Zwecke perfekt.
Danke
Heiko
 

kollimann

Member
Licensed User
Longtime User
muss nochmal nachfrage,
wie ersetze / update ich "einen" Eintrag/Wert in meiner Liste mit WriteObject?
 

mw71

Active Member
Licensed User
Longtime User
....Ausser vielleicht ´ne Datenbank zu benutzen.

SQLite, man muss sich zwar erst mal einarbeiten, aber dann ist das super. Da kann man auch Datensätze ändern/löschen/einfügen ohne alles
einzulesen und dann neu zu schreiben.

Gruß
 
Top