Italian Errore su Lettura RandonAccessFile [SOLVED]

Angelo Messina

Active Member
Licensed User
Longtime User
B4X:
[CODE]
Sub Globals
Type Utente(Codice As Int, User As String,Pwd As String, Email As String)
End Sub

Sub BSignup_Click
Dim Rec As Utente
Rec.User=Nome
Rec.Email=Email
Rec.Pwd=Pwd
WriteRec(Rec)
StartActivity(Login)
End Sub


Sub WriteRec( rec As Utente )
Dim f As RandomAccessFile
f.Initialize(File.DirRootExternal,"Users", False)
Dim RecNumber As Int = UltimoCodice
rec.Codice=RecNumber
Log("RECNUM" & RecNumber & " Codice " & rec.Codice & " user " & rec.User)
f.WriteObject(rec, False, RecNumber)
Log("rec " & rec & "RecNumber " & RecNumber)
f.Close
End Sub

Sub ReadRec

Dim f As RandomAccessFile
Dim Line As String
Dim DataRecord As Utente

f.Initialize(File.DirRootExternal, "Users" , True)
Do While (f.CurrentPosition < f.Size )
       Log("Current " & f.CurrentPosition)[/INDENT]
49    DataRecord=f.ReadObject(f.CurrentPosition)
        Line=DataRecord.Codice & " " &  DataRecord.User & " " & DataRecord.Pwd & " " & DataRecord.Email
    Log(Line)
    ListView2.AddSingleLine(Line)[/INDENT]
Loop
f.Close

End Sub

Error Occurrd on Line: 49

non riesco a capire dove è l'errore[/CODE]
 
Last edited:

udg

Expert
Licensed User
Longtime User
Ciao Angelo,

non capisco l'utilizzo di RecNumber in fase di scrittura. Come avrai letto RAF.WriteObject è orientata ai byte nel senso che un record è determinato dall'insieme di byte che compongono l'oggetto che salvi e di conseguenza la posizione non è una sequenza 0,1,2.. ma byterec1+byterec2+byterec3..

Di conseguenza è sufficiente scrivere: f.WriteObject(rec, false , f.CurrentPosition) per memorizzare il record "rec" nella posizione corrente di "f" ed avanzarne il puntatore alla prossima posizione utile (in pratica f.CurrentPosition+dimensione in byte di rec).
Quando apri il file dati ( f.Initialize(File.DirRootExternal,"Users", False) ) questi si porta automaticamente su f.CurrentPosition=0 ovvero all'inizio del file e come detto, man mano che inserisci record la posizione si incrementa. Idem in lettura (parte da zero e si porta alla prox posizione utile dopo ogni lettura)

Da cui la mia perplessità iniziale: a che serve recnumber e, volendo, da dove arriva e come viene aggiornato UltimoRecord?

udg
 

Star-Dust

Expert
Licensed User
Longtime User
Ho provato il tuo codice e mi funziona. Ho solo tolto StartActivity che non capisco a cosa ti serva

B4X:
Sub BSignup_Click
    Dim Rec As Utente
    Rec.User=Nome
    Rec.Email=Email
    Rec.Pwd=Pwd
    WriteRec(Rec)
    'StartActivity(login)
End Sub


Sub WriteRec( rec As Utente )
    Dim f As RandomAccessFile
   
    f.Initialize(File.DirRootExternal,"Users", False)
    Dim RecNumber As Int = UltimoCodice
    rec.Codice=RecNumber
    Log("RECNUM" & RecNumber & " Codice " & rec.Codice & " user " & rec.User)
    f.WriteObject(rec, False, RecNumber)
    Log("rec " & rec & "RecNumber " & RecNumber)
    f.Close
End Sub

Sub UltimoCodice As Int
    Dim f As RandomAccessFile
   
    f.Initialize(File.DirRootExternal,"Users", False)
    Return f.Size
End Sub


Sub ReadRec
    Dim f As RandomAccessFile
    Dim Line As String
    Dim DataRecord As Utente

    f.Initialize(File.DirRootExternal, "Users" , True)
    Do While (f.CurrentPosition < f.Size )
    Log("Current " & f.CurrentPosition)
    DataRecord=f.ReadObject(f.CurrentPosition)
    Line=DataRecord.Codice & " " &  DataRecord.User & " " & DataRecord.Pwd & " " & DataRecord.Email
    Log(Line)
    'ListView2.AddSingleLine(Line)
    Loop
f.Close
End Sub

Cosi mi funziona perfettamente, non mi da nessun errore
 

Star-Dust

Expert
Licensed User
Longtime User
Credo che RecNumber gli serva per utilizzare la funzione Write anche per sowrascriver eo correggere Record esistenti , che so tornare indietro e correggerne uno che non é quello corrente..

Comunque a me funziona
 

Angelo Messina

Active Member
Licensed User
Longtime User
ho scritto una sub che scrive un numero di codice che mi serve per associare questa scheda a un oggetto.



B4X:
ub UltimoCodice As Int

    Dim f As RandomAccessFile
    Dim Valore As Int
   
        f.Initialize(File.DirRootExternal,"Indice",  False)
        Log(f.CurrentPosition & "/" & f.Size)
        Try
            Valore =  f.ReadInt(1)
        Catch
            Valore = 0
            f.WriteInt( Valore, 1)
        End Try
        Log("Valore " & Valore)
        Valore = Valore +1
        f.Writeint(Valore, 1)
        f.Close
   
    Return Valore

End Sub
 

Angelo Messina

Active Member
Licensed User
Longtime User
nulla da fare errore sulla riga 46

Error occurred on line: 46 (ListaUser)
java.lang.NegativeArraySizeException: -1

46 DataRecord=f.ReadObject(f.CurrentPosition)
 

Star-Dust

Expert
Licensed User
Longtime User
A prescindere dalla sub UltimoCodice che io mi sono creato una mia per far girare il resto del codice.

MA tutto il resto non mi segnala nessun errore.
Ribadisco la mia perplessità sullo StartActivity che non spieghi cosa sia
 

Angelo Messina

Active Member
Licensed User
Longtime User
uso StartActivity per eseguire una nuova Activity in conseguenza con quella che mi da questo errore (uso B4a da circa una settimana)
 

Star-Dust

Expert
Licensed User
Longtime User
Sembra che ti dica che il file sia vuoto.
Aggiungi un log per vedere se il file é popolato o vuoto

B4X:
log(f.size)
DoWhile (f.CurrentPosition < f.Size )
   Log("Current " & f.CurrentPosition)
   DataRecord=f.ReadObject(f.CurrentPosition)
   Line=DataRecord.Codice & " " & DataRecord.User & " " & DataRecord.Pwd & " " & DataRecord.EmailLog(Line)
  'ListView2.AddSingleLine(Line)Loop
 
Last edited:

Angelo Messina

Active Member
Licensed User
Longtime User
Error occurred on line: 46 (ListaUser)
java.lang.NegativeArraySizeException: -1

46 DataRecord=f.ReadObject(f.CurrentPosition)

sono con questo errore da un paio di ore
 

Star-Dust

Expert
Licensed User
Longtime User
Non é che dico che fai male, pensavo richiamasse ricorsivamente se stessa. E questo sarebbe un problema.

Cmq supponendo che il file sia vuoto

si verificherebbe
B4X:
f.Size=0
f.CurrentPosition=-1

B4X:
 While (f.CurrentPosition < f.Size)
Questa condizione risulterebbe vera ma andrebbe in errore perchè la posizione corrente sarebbe -1 , numero non valido

prova così

B4X:
f.CurrentPosition=0
if f.Size>0 then
    DoWhile (f.CurrentPosition < f.Size )
        Log("Current " & f.CurrentPosition)
       DataRecord=f.ReadObject(f.CurrentPosition)
       Line=DataRecord.Codice & " " & DataRecord.User & " " & DataRecord.Pwd & " " & DataRecord.Email
       Log(Line)
       ListView2.AddSingleLine(Line)
   Loop
End if
 

Angelo Messina

Active Member
Licensed User
Longtime User
forse devo inserire una nuova libreria?

size 293
Current 0
Error occurred on line: 49 (ListaUser)
java.lang.NegativeArraySizeException: -1
 

Star-Dust

Expert
Licensed User
Longtime User
UltimoCodice serve a dirti la posizione dell'ultimo record?
 

Angelo Messina

Active Member
Licensed User
Longtime User
si perché pensavo di manutenere questi record conoscendo il codice (indice) assegnato da me come si faceva una volta con i file random
 

Star-Dust

Expert
Licensed User
Longtime User
Ma non faresti prima usando un database SQL?
 

Angelo Messina

Active Member
Licensed User
Longtime User
pensavo di no appesantire di più l'app ho già un servizio che gira leggendo dati da una device Bluetooth
 
Top