Italian scambio file android ios

toro1950

Active Member
Licensed User
Buona domenica a tutti, ero pronto a publicare le mie due app, pagato apple e google,
scaricati i file di certificazione dell'app ios (provision.mobileprovision, ios_distribution.cer e altro)
nell'ultimo controllo ho scoperto un errore che non sono riuscito a risolverlo dopo due giorni di prove.
Le app utilizzano due database sqlite con estensione xls., tramite un pulsante è possibile inviare i due file nel
mio sito, utile in caso si voglia cambiare cellulare. Per l'upload dei file sul sito ho utilizzato il trasferimento
ftp in ambedue i sistemi, per il dowload ho utilizzato HttpJob in ambedue i sistemi. ecco il problema:
se effettuo l'upload con iphone , i file vengono recuperati perfettamente da ambedue i sistemi.
Se effettuo l'upload con android, i file vengono recuperati tranquillamente da andrid ma non dal
iphone, non da nessun errore, all'apprenza sembra che li scarichi ambedue, in effetti un file viene recuperato
perfettamente, questo db ha pochi campi, mentre quello che non viene scaricato ha una decina di campi.
Ora viene il bello, una volta scaricato, il secondo database risulta vuoto, se tento di aggiungere un
record, la sub preposta non mi da nessun errore , mi dice che il record è stato registrato ma non riesco
a visualizzarlo, nella lista non appare e sicuramente non c'è perche se riscrivo il record me lo registra nuovamente,
normalmente mi chiede se sono sicuro di sovrascrivere il record. Ho provato ad effettuare il download in ftp
ma pur non avendo errori ha lo stesso problema, con andoroid funziona perfettamente sia in ftp che in HttpJob.
Ho messo a confronto i due file sul sito aprendoli con excell e non c'è la minima differenza visiva tra i due file
il nome del file che da errore finisce con l'anno in corso, prenotazioni2024.xls.
Mario
 

sirjo66

Well-Known Member
Licensed User
Longtime User
A volte quando si fa upload con FTP (almeno su Windows) bisogna configurare il programma client in modo da dirgli che deve sempre fare i trasferimenti dei file in modo binario.
Succede infatti a volte che se non si specifica il trasferimento "binario" i file vengano corrotti (mi è successo personalmente)

Non credo sia il tuo caso, ma un'occhiatina proverei a dargliela
 

Attachments

  • Immagine.png
    Immagine.png
    24.1 KB · Views: 23
Last edited:

toro1950

Active Member
Licensed User
Effettuando ulteriori prove e utilizzando ftp in entrambi i sistemi ho ottenento questi risultati;
IOs: upload e download ok sullo stesso (testato fino a 120 kb per oltre non ho dati), se effettuo il download dei dati scaricati da Android anche se risulta effettuato non ci sono i dati nel database
Android: upload e download ok con file inferiore ai 50 Kb Download ok anche con file scaricati da IOs, con oltre 50 kb dopo l'upload risultano sul sito, ma dopo il download che risulta effettuato, il databae risulta vuoto. sirjo66 mi dicevi di configurare ftp affinchè faccia il trasferimento in modo binario, ma non trovo come farlo, l'esempio che hai postato è su FileZilla. Qualcun'altro ha riscontarato questi problemi?
 

LucaMs

Expert
Licensed User
Longtime User
Ora viene il bello, una volta scaricato, il secondo database risulta vuoto, se tento di aggiungere un
record, la sub preposta non mi da nessun errore , mi dice che il record è stato registrato ma non riesco
a visualizzarlo, nella lista non appare e sicuramente non c'è perche se riscrivo il record me lo registra nuovamente,
normalmente mi chiede se sono sicuro di sovrascrivere il record.
A me questo comportamento non sembra affatto dovuto a FTP, sospetto (e chiedo scusa se sbaglio, cosa impossibile, tranne i casi in cui... sbaglio 😅 ) che tu scriva in un DB (parli di Android, mi pare, no?!) ma che poi cerchi il record in un secondo DB.

Avvenuta la scrittura del nuovo record, esegui una query di lettura e la visualizzazione di quanto letto (anche un semplice Log)?
 

LucaMs

Expert
Licensed User
Longtime User
A me questo comportamento non sembra affatto dovuto a FTP, sospetto (e chiedo scusa se sbaglio, cosa impossibile, tranne i casi in cui... sbaglio 😅 ) che tu scriva in un DB (parli di Android, mi pare, no?!) ma che poi cerchi il record in un secondo DB.

Avvenuta la scrittura del nuovo record, esegui una query di lettura e la visualizzazione di quanto letto (anche un semplice Log)?
Dato che, come ormai dovrebbe essere noto, non ho B4i e tantomeno HW Apple, quindi non so se ci siano particolari differenze, in questo caso, tra B4A e B4i, ho chiesto a ChatGPT di buttare giù una paginetta che esegua le seguenti cose (proprio come le ho elencate a quell'intelligentone 😁):

Scrivi una B4XPage che funzioni bene sia per Android che per iOS e che faccia le seguenti cose
1 - scarichi da un sito un file di tipo SQLite usando FTP
2 - supponendo che il DB SQLite abbia una tabella "Persona" con i campi "Nome", "Cognome", dopo il download scriva un nuovo record in questa tabella, con dati fittizi
3 - legga tutti i record ed esegua un Log dei dati letti, compreso il nuovo record.

Ecco cosa ha generato:
B4X:
' B4XPage per Android e iOS
Sub Class_Globals
    Private FTPClient As FTP
    Private sql As SQL
    Private DBPath As String
    Private DBName As String = "mydatabase.db"
End Sub

Public Sub Initialize
    ' Inizializzazione della B4XPage
End Sub

' Questa routine verrà chiamata quando la pagina viene creata
Private Sub B4XPage_Created (Root As B4XView)
    ' Imposta il percorso del database in base al sistema operativo
    #If B4A
        DBPath = File.DirInternal
    #Else If B4i
        DBPath = File.DirDocuments
    #End If
 
    ' Scarica il database usando FTP
    StartFTPDownload
End Sub

' Scarica il database da un server FTP
Private Sub StartFTPDownload
    FTPClient.Initialize("FTP", "ftp.example.com", 21, "user", "password")
    FTPClient.PassiveMode = True
    FTPClient.DownloadFile("/path/to/remote/db/" & DBName, False, DBPath, DBName)
End Sub

' Evento chiamato quando il download è completato
Private Sub FTP_DownloadCompleted (ServerPath As String, Success As Boolean)
    If Success Then
        Log("Download completato con successo!")
        OpenDatabase
        ' Inserisci un nuovo record
        InsertRecord("Mario", "Rossi")
        ' Leggi tutti i record e logga i dati
        ReadAllRecords
    Else
        Log("Errore nel download")
    End If
End Sub

' Apri il database SQLite
Private Sub OpenDatabase
    If File.Exists(DBPath, DBName) Then
        sql.Initialize(DBPath, DBName, True)
    Else
        Log("Database non trovato!")
    End If
End Sub

' Inserisci un nuovo record nella tabella "Persona"
Private Sub InsertRecord(Nome As String, Cognome As String)
    If sql.IsInitialized Then
        sql.ExecNonQuery2("INSERT INTO Persona (Nome, Cognome) VALUES (?, ?)", Array As Object(Nome, Cognome))
        Log("Record inserito: " & Nome & " " & Cognome)
    Else
        Log("Errore: database non inizializzato.")
    End If
End Sub

' Leggi tutti i record dalla tabella "Persona" e logga i risultati
Private Sub ReadAllRecords
    If sql.IsInitialized Then
        Dim ResultSet As ResultSet = sql.ExecQuery("SELECT Nome, Cognome FROM Persona")
        Do While ResultSet.NextRow
            Dim Nome As String = ResultSet.GetString("Nome")
            Dim Cognome As String = ResultSet.GetString("Cognome")
            Log("Record: " & Nome & " " & Cognome)
        Loop
        ResultSet.Close
    Else
        Log("Errore: database non inizializzato.")
    End If
End Sub

' Gestisce l'errore FTP se qualcosa va storto
Private Sub FTP_Error (ErrorMessage As String)
    Log("Errore FTP: " & ErrorMessage)
End Sub

' Quando la B4XPage viene chiusa, chiudi anche il database
Private Sub B4XPage_Disappear
    If sql.IsInitialized Then sql.Close
End Sub
ed ha commentato:
1729771342238.png


A occhio il codice mi sembra corretto.
Fai questa prova (crea proprio un DB con quella sola tabella e solo quei due campi, vuoto oppure con un record già aggiunto) e facci sapere.
 

toro1950

Active Member
Licensed User
Grazie LucaMS, questo è il mio codice, e mi sembra che non cambi molto dal tuo, dai un occhiata
B4X:
Sub upload
    SQLDataBasePath = xui.DefaultFolder
fl = txtcognome.Text.Trim & txtnome.Text.Trim
    testo= "nomefiledb.rsd"
   
        If File.Exists(SQLDataBasePath,testo) Then
     
        ftp.Initialize("ftp", "ftp.miosito.it", 21, "*******@aruba.it", "*******")
        ftp.PassiveMode = True
        If RadioB1.Checked=True Then
        'tipo di professionista
            Dim sf As Object = ftp.UploadFile(SQLDataBasePath,testo,True,"miosito.it/public/miacartella1/" & fl & testo)
        Else
        'altro tiop di professionista
            Dim sf As Object = ftp.UploadFile(SQLDataBasePath,testo,True,"myosito.it/public/miacartella2/" & fl & testo)
        End If
 
        Wait For (sf) ftp_UploadCompleted (ServerPath As String, Success As Boolean)
        If Success Then
                ToastMessageShow("il file **** è stato salvato sul server",False)
            Sleep(1000)
        Else
            ToastMessageShow("Error uploading file****", False)
                    End If
        ftp.Close
End Sub
Sub  download
 
    SQLDataBasePath = xui.DefaultFolder
    fl = txtcognome.Text.Trim & txtnome.Text.Trim
    testo= "nomefiledb.rsd"
    testo1= fl & testo
    If File.Exists(SQLDataBasePath, "nomefiledb.rsd") Then
        File.Delete(SQLDataBasePath, "nomefiledb.rsd")
    End If
    Sleep(1000)
        ftp.Initialize("ftp", "ftp.miosito.it", 21, "*****@aruba.it", "*******")
    ftp.PassiveMode = True
    If RadioB1.Checked=True Then
        Dim sf As Object = ftp.DownloadFile("miosito.it/public/miacartealla1" & testo1,True, SQLDataBasePath, testo)
    Else
        Dim sf As Object = ftp.DownloadFile("miosito.it/public/miacartella2/" & testo1,True, SQLDataBasePath, testo)
       
    End If
    Wait For (sf) ftp_DownloadCompleted(ServerPath As String, Success As Boolean)
    If Success Then
        ToastMessageShow ("File ****** ripristinato",False)
        Sleep(1000)
        ftp.close
       
End Sub
questo codice è identico per i due sistemi, su iphone nesssun problema ad eccezione che non ricarica i file rilasciati da Androide, appena caricati se cerco di visualizzarli esce, poi la rientro qualcosa mi fa fare ma il database è vuoto, qui potrebbe essere valida la tua supposizione
mentre su android funziona bene con un dabase che non superi i 50/60 Kb ed in questo caso carica bene anche il file rilasciato da iphone,
oltre non mi da errori ma il datbase risulta vuoto e anche qui ese la prima volta al rilancio non esce. l'unica differenza di codice è che b4i non ha ftp.close ma penso che questo non è un problema
 

LucaMs

Expert
Licensed User
Longtime User
A naso sembra ok, ma non lo esamino al microscopio perché... manca la parte di codice che poi cerca di scrivere e leggere nel DB e non vorrei che tu lo facessi prima che il download sia effettivamente completato, a causa di quegli Sleep che hai usato (chiami la Sub "download" usando Wait For? Altrimenti sarebbe un problema).
 

toro1950

Active Member
Licensed User
Grazie LucaMS dei consigli, il nome delle sub non sono downoload e upload, l'ho scritto nel post per fa capire ogni sub cosa fa, ora provo a cambiare xui.DefaultFolder con File.DirInternal e File.DirDocuments anche se con B4i non ho problemi. con la speranza che vada bene, è che non riesco a spiegarmi che fino a 50/60 kb, praticamente 700 record (solo 4 campi) funziona bene e poi non più. dovrei arrivare ad oltre 3000 record, l'ho provato con circa 1660 record, su iphone non ci sono problemi, ora chiede ai probabili clienti che qualcuno mi invia i suoi dati, visto che l'app si dovrebbe interfacciare con il loro software sul pc, sviluppato da me. ok entro stasera ti farò sapere
 

toro1950

Active Member
Licensed User
Ho provato con le modifica che mi hai consigliato, ma nulla è cambiato, fino 50 kb nessun problema, un dubbio me lo hai fatto venire, o meglio hai rafforzato quello che avevo, sul pc per apportare qualche modifica su un database, esempio aggiornamento dello stesso, dal software prima di farlo lo chiudo e questo anche prima di uscire dal programma, con nomedatabase.close, su B4a-i non trovo nulla. per avere gli eventuali errori di ftp come fare?. Io penso che forse si deve impostare qualcosa su ftp altrimenti non capisco perchè fino a 700 record funziona bene e poi no,il codice è sempre lo stesso che su b4i funziona bene, almeno fino a 1650 record.
 

LucaMs

Expert
Licensed User
Longtime User
Grazie LucaMS dei consigli, il nome delle sub non sono downoload e upload, l'ho scritto nel post per fa capire ogni sub cosa fa
Non intendevo dire che i nomi delle Sub siano sospetti, che possano creare problemi, ma che avendo messo uno Sleep(1000) nella "download", se esegui una cosa di questo tipo:

pseudo codice:
download
ScriviNuovoRecord - db
Leggi_i_record - db
la scrittura avviene prima dell'esecuzione del comando FTP.

Però, adesso ho guardato di nuovo e tu lo Sleep lo metti dopo aver cancellato l'eventuale DB già esistente sul dispositivo, quindi non scriverebbe, non troverebbe il DB.

[Finisco di guardare 'sto "stupido" film - giallo, con Al Pacino - poi guarderò meglio]
 

LucaMs

Expert
Licensed User
Longtime User
. per avere gli eventuali errori di ftp come fare?.
Guarda il codice generato da ChatGPT. Ha un evento:

B4X:
' Gestisce l'errore FTP se qualcosa va storto
Private Sub FTP_Error (ErrorMessage As String)
    Log("Errore FTP: " & ErrorMessage)
End Sub
Se non scatta, il download è stato completato correttamente, quindi l'errore è altrove.
 

LucaMs

Expert
Licensed User
Longtime User
Dopo il download, sfrutta anche questi comandi, per il debugging:
B4X:
Log("File.LastModified: " & File.LastModified(SQLDataBasePath, FileName))
Log("File.Size: " & File.Size(SQLDataBasePath, FileName))

(Mi pare che il tuo nome file sia nella variabile "testo", quindi ovviamente userai quella al posto di FileName)
 
Last edited:

toro1950

Active Member
Licensed User
Ho inserito l'evento suggerito da ChatGPT ma non esce nesssun avviso, anche se penso non serve perche nel codice ho scritto che se non
riesce il downolad un messaggio avvisa che non è riuscito, nel post con il codice manca questo perche non copiato del tutta la sub, quindi riporto il seguito
Ho provato senza gli Sleep e ho fatto sovrascrivere il database (ho eliminato il delete) ma il risultato è sempre uguale ok<50 kb false >50 kb
B4X:
Wait For (sf) ftp_DownloadCompleted(ServerPath As String, Success As Boolean)
    If Success Then
        ToastMessageShow ("File **** ripristinato",False)
        Sleep(1000)
        ftp.close
        fl=fl & testo
        rimuovi 'rimuove da sito il file scaricato
        Sleep(1000)
        Else
        ToastMessageShow("errore download file ******",False)
        End If
e non è mai uscito questo messaggio. domani pomeriggio (domani mattina devo cogliere le ulive) provo ad inserire il codice che mi hai consigliato . Qui ci sono due problemi da risolvere, perchè il database di B4a non è compatibile con B4i mentre quello di B4i viene letto da B4a, e perchè l'ftp di android funziona solo con file inferiori ai 50 kb. Domani sera se non si risolve effettuo un post sul forum intenazionale con la speranza che Erel o qualcuno che ha avuto i miei stessi problemi mi aiutino
 

LucaMs

Expert
Licensed User
Longtime User
perchè il database di B4a non è compatibile con B4i mentre quello di B4i viene letto da B4a,
Non è così, SQLite è compatibile con entrambi.

Le prove da fare per scoprire il problema sono tante, alcune già dette (dopo il downlad, esegui l'aggiunta di un record e poi rileggilo, ovvero esegui una query Select, non vorrei che tu aprissi il DB con un tool esterno. Anche il controllo del File.Size, se diverso da quello sul sito).
 

toro1950

Active Member
Licensed User
Buongiorno a tutti, LucaMs per aiutarti ad aiutarmi😂i due database vengono utilizzati e gestiti sulla BaxMainpage mentre l'upload ed il dowload viene gestito nella page2, quando viene effettuato il download, dopo una 20na di secondi chiudo l'App e la riapro, all'apertura scopro se ci sono i database, nel download sembra che tuto vada bene, dal risultato del codice. Ora vi lascio vado a cogliere le olive
 

LucaMs

Expert
Licensed User
Longtime User
quando viene effettuato il download, dopo una 20na di secondi chiudo l'App e la riapro, all'apertura scopro se ci sono i database
Questo è un punto critico: COME controlli che i DB ci siano? E dove?

Anziché fare così, fai come già ti ho detto e ripeto, spero meglio.
  1. Esegui il download; oltre a verificare la variabile Success, che già dovrebbe essere sufficiente, a dire il vero, lascia comunque l'evento FTP_Error
  2. Completato il download, fai eseguire un Log(File.Size(...)) e confronta il valore con quello del DB sul server
  3. Completato il download, esegui una semplice query, tipo: "Select * From NomeTabella LIMIT 5" - con il LIMIT così non dovrai vedere scorrere centinaia di record. Altrettanto semplicemente, visualizza i dati nella finestra dei Log, senza dover creare GUI.
  4. Non ottieni errori e vedi i dati nella finestra dei Log? Allora tutto dovrebbe essere ok, no? Ma puoi "insistere", aggiungi un record ed esegui di nuovo la Select (stavolta senza LIMIT, altrimenti non vedresti l'ultimo record aggiunto; oppure crea una query Select con la clausola WHERE che ti consenta di leggere proprio il record aggiunto)
  5. Facci sapere se con le olive farai olio o te le mangerai 😅
 

toro1950

Active Member
Licensed User
Buonaserata a tutti, LucaMs ho inserito il codice file.size, io non so dove visualizzare il log cosi ho ho iserito un msgbox
B4X:
Msgbox(File.Size(SQLDataBasePath, testo)," ")
i risultati sono questi
record 600 upload sul sito 45104 download 45056 il database viene ripristinato correttamente sia se lo cancello prima o se lo sovrascrivo
record 1000 upload sul sito 61526 download 61439 il database non vienre ripristinato correttamente alla prima query l'app si chiude.
come vedi ci sono pochi byte di differena sia se ripristinato correttamente sia se non correttamente. non ho mai un messaggio di errore
dall'altro codice che mi hai consigliato FTP_Error
per visulalizzare il database uso il seguente codice
B4X:
paneldb.Visible=True
             
        listadb.AsView.Visible=True
         SQL1.Initialize(SQLDataBasePath, nomedb, True)
          ToastMessageShow("Qualche secondo.....",False)
            updatedb

per l'update


B4X:
private Sub updatedb
        listadb.Clear
 
    Dim Query As String
    Dim ResultSet1 As ResultSet
    Query = "SELECT * FROM mytabel"
    ResultSet1 = SQL1.ExecQuery("select * from mytabel")
        Do While ResultSet1.NextRow
ecc ecc
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
ho inserito il codice file.size, io non so dove visualizzare il log cosi ho ho iserito un msgbox
Per quale motivo?
Fin quando l'app non sia priva di bug (almeno in apparenza) dovresti testarla dall'IDE E IN MODALITA' DEBUG, non Release.
Se usi il Bridge, per l'installazione, dovresti "decommentare" la seguente riga scritta nel Main:
B4X:
'#BridgeLogger: True
Connesso, invece, tramite USB non dovrai fare altro che guardare la finestra dei Log.

record 600 upload sul sito 45104 download 45056 il database viene ripristinato correttamente sia se lo cancello prima o se lo sovrascrivo
record 1000 upload sul sito 61526 download 61439 il database non vienre ripristinato correttamente alla prima query l'app si chiude.
La dimensione dovrebbe essere identica in tutti i casi (a meno che tu non lasci qualcosa in sospeso sul server, ovvero il DB "aperto", ma se ho capito bene, il server è solo d'appoggio per il file, non viene aperto ed usato dal server stesso).
Questo mi fa sospettare che, come ha scritto @sirjo66 dall'inizio, tu debba eseguire FTP in modalità binaria.
sirjo66 mi dicevi di configurare ftp affinchè faccia il trasferimento in modo binario, ma non trovo come farlo,
Come farlo:
B4X:
FTP.UploadFile(DeviceFolder, DeviceFile, False, ServerFilePath)

FTP.DownloadFile(ServerFileaPath, False, DeviceFolder, DeviceFile)
Quel parametro False indica di NON usare ASCII e, di conseguenza, Binary.
 
Last edited:
Top