Italian Errore salvataggio dati su smartphone (ok permessi)

3uowiS

Active Member
Licensed User
Buonasera a tutti, sono nuovo sul forum e sono un novellino, sto facendo un videocorso su Udemy per imparare B4A.
Ho un problema con un errore che non riesco a capire da dove deriva e quindi chiedo a voi esperti se gentilmente potreste darmici un occhio perché sono 3 giorni che ci sbatto la testa senza venirne a capo.

Lancio l'app e a fine test, mi ha chiede il permesso di accedere allo smartphone ma una volta accettato crasha con l'errore dell'immagine allegata.

Questo è il codice della sub e la linea 67 è quella a cui l'errore fa riferimento :

B4X:
     Sub RegisterResults(minutesInt As Int, secondsInt As Int, errorsInt As Int)
        
        Dim list1 As List
        
        'controllo se il file di testo esiste
        If File.Exists(File.DirRootExternal, "MathTest/ListResults.txt") Then
            'se il file esiste...
            'carico i dati del file di testo
            list1 = File.ReadList(File.DirRootExternal, "MathTest/ListResults.txt")
            
            Dim trovato As Boolean
            trovato = False
            
             For i = 0 To 99
                
                 ListResults(i) = list1.Get(i)
                
                If ListResults(i) = "0" And trovato = False Then
                    
                    'riempo i valori del'array con i dati da registrare
                    ListResults(i) = dayTodayString & "|" & monthTodayString & "|" & yearTodayString & "|" & minutesInt & "|" & secondsInt & "|" & errorsInt
                    
                    'imposto la boolean su True per interrompere il ciclo di registrazione
                    trovato = True
                    
                End If
                            
            Next
            
            'se trova tutti gli slot occupati, cancella il primo e sposta tutto di uno
            If trovato = False Then
                For i = 1 To 99
                    ListResults(i-1) = ListResults(i)
                Next
                ListResults(99) = dayTodayString & "|" & monthTodayString & "|" & yearTodayString & "|" & minutesInt & "|" & secondsInt & "|" & errorsInt
                
            End If
                
            
            'salvo l'array nella directory
            File.WriteList(File.DirRootExternal,"MathTest/ListResults.txt", ListResults)
                    
        Else 'se il file non esiste...
            
            Dim Folder As String ="MathTest"
    
            File.MakeDir(File.DirRootExternal,Folder)
    
            Dim FullPath As String = File.Combine(File.DirRootExternal,Folder)
    
    
            rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
    
            Wait For Activity_PermissionResult (Permission As String, Result As Boolean)
    
            If Result = False Then
    
                MsgboxAsync("No permission to access external storage", "")
    
                Return
    
            Else
            
                For i = 0 To 99
                    ListResults(i) = 0
                Next
                    ListResults(0) = dayTodayString & "|" & monthTodayString & "|" & yearTodayString & "|" & minutesInt & "|" & secondsInt & "|" & errorsInt
            
                'salvo l'array nella directory
                File.WriteList(FullPath,"ListResults.txt", ListResults)
            
            End If
        End If
        
    End Sub

Sapete dirmi quale può essere il motivo?

Grazie in anticipo!
 

Attachments

  • err1.jpg
    err1.jpg
    467.2 KB · Views: 157

3uowiS

Active Member
Licensed User
Non so se può aiutare a capire il problema, ma ho fatto anche un'altra prova, ossia che al posto di tutta la stringa incriminata metto

B4X:
ListResults(0) = "2"

visto che il file non esiste ancora teoricamente dovrebbe salvarmi un 2 nella riga 0 dell'array, ma non dovrebbe crashare, giusto?

Invece in questo caso mi restituisce quest'altro errore (in allegato) che in fa riferimento a questa riga:

B4X:
File.WriteList(FullPath,"ListResults.txt", ListResults)

Non capisco perché nell'errore c'è il percorso "/storage/emulated......" visto che il debug lo faccio con lo smartphone e quindi senza emulatore.
Non me ne intendo, ma questa cosa non mi torna e non vorrei che il problema fosse lì, perché magari non riesce a creare la cartella dove salvare all'interno dello smartphone nonostante i permessi concessi.

P.S: tra le varie prove che ho fatto ho anche cambiato nome per farmi richiederi i permessi prima di salvare, per questo adesso si chiama "QuizMatematica" mentre nella sub del primo post la cartella è "Math Test".

Grazie di nuovo.
 

Attachments

  • err2.jpg
    err2.jpg
    374.8 KB · Views: 156

LucaMs

Expert
Licensed User
Longtime User
Se non hai un motivo speciale per salvare nella Root, usa la File.DirInternal, che non necessita di permessi.
Anziché usare degli Array, usa le List; con queste puoi cercare se un elemento esista senza dover scorrere un Array:
B4X:
Dim lstMieiDati As List
lstMieiDati.Initialize
'
' Qui riempi la lista, se vuoi.
'
If lstMieiDati.IndexOf("Dato da cercare") <> - 1 Then
' Trovato
Else
' Non trovato
End If

Separa il codice "di lavoro" da quello del salvataggio (crea una routine-sub per il salvataggio/lettura o due separate).
 

3uowiS

Active Member
Licensed User
Se non hai un motivo speciale per salvare nella Root, usa la File.DirInternal, che non necessita di permessi.
Ho provato con File.DirInternal, ma non sono riuscito a togliere l'array, sono ancora troppo inesperto perché l'array comunque lavora in collaborazione con una lista e quindi ci sarebbe da cambiare completamente quel processo di salvataggio e lettura.

L'errore descritto nel primo post me lo da lo stesso, sempre riferito a questa riga:
B4X:
  ListResults(0) = dayTodayString & "|" & monthTodayString & "|" & yearTodayString & "|" & minutesInt & "|" & secondsInt & "|" & errorsInt

Provando invece a mettere ListResults(0) = "2" come ho scritto nel secondo post il file viene salvato, quindi almeno quello è stato risolto.
Rimane da capire cosa c'è che non gli piace in quella riga, l'ho guardata e riguardata ma non riesco a vederci niente di anomalo.

Vi rimetto il codice della sub corretto:
B4X:
Sub RegisterResults(minutesInt As Int, secondsInt As Int, errorsInt As Int)
    
    Dim list1 As List
    
    'controllo se il file di testo esiste
    If File.Exists(File.DirInternal, "MathTest/ListResults.txt") Then
        'se il file esiste...
        'carico i dati del file di testo
        list1 = File.ReadList(File.DirInternal, "MathTest/ListResults.txt")
        
        Dim trovato As Boolean
        trovato = False
        
         For i = 0 To 99
            
             ListResults(i) = list1.Get(i)
            
            If ListResults(i) = "0" And trovato = False Then
                
                'riempo i valori del'array con i dati da registrare
                ListResults(i) = dayTodayString & "|" & monthTodayString & "|" & yearTodayString & "|" & minutesInt & "|" & secondsInt & "|" & errorsInt
                
                'imposto la boolean su True per interrompere il ciclo di registrazione
                trovato = True
                
            End If
                        
        Next
        
        'se trova tutti gli slot occupati, cancella il primo e sposta tutto di uno
        If trovato = False Then
            For i = 1 To 99
                ListResults(i-1) = ListResults(i)
            Next
            ListResults(99) = dayTodayString & "|" & monthTodayString & "|" & yearTodayString & "|" & minutesInt & "|" & secondsInt & "|" & errorsInt
            
        End If
            
        
        'salvo l'array nella directory
        Save
                
    Else 'se il file non esiste...
        
        Dim Folder As String ="MathTest"

        File.MakeDir(File.DirInternal,Folder)

        For i = 0 To 99
            ListResults(i) = 0
        Next
            ListResults(0) = dayTodayString & "|" & monthTodayString & "|" & yearTodayString & "|" & minutesInt & "|" & secondsInt & "|" & errorsInt
        
        'salvo l'array nella directory
        Save
        
    End If
    
End Sub

Qualcuno riesce a capire dov'è il problema?
 

udg

Expert
Licensed User
Longtime User
Possibile che sbagli qualcosa nel parsing della stringa? L'errore indica una conversione errata da stringa a numero o, meglio, nella rappresentazione di un numero (NumberFormatException).

Nel loop 14-26 perchè assegnare a ListResults un valore e poi (eventualmente) cambiarlo? Non potresti eseguire il test su list1 e poi far uso dei rami then/else per popolare corerttamente l'array ricevente? Qualcosa tipo:
B4X:
..
    Dim trovato As Boolean = False
    For i = 0 To 99
        if not(trovato) AND (list1(i) = "0") then
           'riempo i valori del'array con i dati da registrare
           ListResults(i) = $"${dayTodayString}|${monthTodayString}|${yearTodayString}|${minutesInt}|${secondsInt}|${errorsInt}"$
           'imposto la boolean su True per interrompere il ciclo di registrazione
           trovato = True
        else
             ListResults(i) = list1.Get(i)
        end if    
   Next
Per interrompere il loop c'è anche l'istruzione Exit.
B4X:
For i = 1 to 1000
 If <some condition> Then Exit
Next
 

maXim

Active Member
Licensed User
Longtime User
... un problema simile lo sto affrontando da qualche giorno con alcuni partecipanti in tre corsi diversi da me condotti e che ancora, assieme a dei miei colleghi, non siamo riusciti a risolvere... l'unica cosa che abbiamo notato, tra chi ha riscontrato il problema, è che tutti operano con Android 9.0 su device Samsung A10...
 

LucaMs

Expert
Licensed User
Longtime User
Mi sta venendo il dubbio che tu abbia dichiarato ListResults come Array di interi, anziché di stringhe. E' chiaro che se fosse così, l'assegnazione:
ListResults(i) = dayTodayString & "|" & monthTodayString & "|" & yearTodayString & "|" & minutesInt & "|" & secondsInt & "|" & errorsInt
darebbe errore!

[Tra l'altro, visto che è un Array e non una List, meglio chiamarlo strResults()]
 

3uowiS

Active Member
Licensed User
Mi sta venendo il dubbio che tu abbia dichiarato ListResults come Array di interi, anziché di stringhe.
Bravissimo!!! Ecco dove stava l'errore! L'avevo dichiarato come int! Grazie mille davvero! Gli cambio anche il nome come mi hai consigliato. 🙂

Grazie anche agli altri, i vostri consigli sono comunque preziosi, soprattutto per me che sto imparando B4A senza nessuna conosenza di base da solamente una decina di giorni.
Sicuramente mi rileggerete presto. 😜
 
Top