Italian Custom Grid View dal SQL image (blob) -B4A

Matteo Granatiero

Active Member
Licensed User
Ho visto questo Custom Grid View Example and Library, ma nella funzione di questa libreria (grid.add) è possibile caricare un immagine solo da un URL internet. Sapete come fare per adattarla al caricamento di un Blob del Sql database? O comunque come creare con altro sistema una Grid View di Immagini prese dai Blob del SQL?
Lascio il codice che utilizzo per caricare i Blob in una ListView.
B4X:
    Cursor1 = SQL1.ExecQuery2("SELECT * FROM Vestiti WHERE Categoria = ? ORDER BY rowid DESC", Array As String("Maglioni"))
For i=0 To Cursor1.RowCount-1
    
        Cursor1.Position=i
        
        Dim Buffer() As Byte
        Buffer = Cursor1.GetBlob("Immagine")
        Dim InputStream1 As InputStream
        InputStream1.InitializeFromBytesArray(Buffer, 0, Buffer.Length)
        Dim Bitmap1 As Bitmap
        Bitmap1.Initialize2(InputStream1)
        InputStream1.Close
        
                    ListView1.AddTwoLinesAndBitmap("","",Bitmap1)

Next
 

LucaMs

Expert
Licensed User
Longtime User
Ho visto questo Custom Grid View Example and Library, ma nella funzione di questa libreria (grid.add) è possibile caricare un immagine solo da un URL internet. Sapete come fare per adattarla al caricamento di un Blob del Sql database?
Sarebbe necessario avere il sorgente, quindi no, non si può.

Questo probabilmente non usa un DB ma, sapendo già come prelevare la bitmap, non dovresti avere problemi a modificarlo:

https://www.b4x.com/android/forum/threads/grid-class-preoptimizedclv.116309/post-726808
 

Matteo Granatiero

Active Member
Licensed User

Matteo Granatiero

Active Member
Licensed User
Allega una prova e proveremo a correggerla ;)
Allega una prova e tenteremo di correggerla ;)
Ho voluto provare forse l'idea piu facile senza utilizzare librerie ecc, ovvero quella di creare un array infinito di immagini in base al numero di item riferiti dal (For i to Cursor.get). L'idea sarebbe quella di caricare max due ImageView per riga all'interno di una ScrollView in modo di avere sulla stessa pagina tutti gli item (immagini) caricate in ImgView e quindi ricreare una Grid View manualmente. Ovviamente io ho fallito ma cercando un po in giro piu o meno questo dovrebbe essere l'inizio. Non mi da nessun errore ma nemmeno nessun risultato. Riuscire in questo significherebbe dare anche a tutta la comnità una possibilità di creare questa maledetta Grid View da Sql che non si trova in giro. Grazie in anticipo!
Ho tentato piu volte a comprimere ed a caricare il file, ma nonostante sia di 2,0MB dice che è troppo grande. Percio allego il Link di MediaFire
File Download
 

LucaMs

Expert
Licensed User
Longtime User
Ok ma già in partenza l'idea è "sbagliata", perché occuperesti un mare di memoria, in un array e poi anche nella ScrollView.

Il "modo" migliore sarebbe di scaricare da un server le immagini solo all'occorrenza e visualizzarle solo all'occorrenza.
 

Matteo Granatiero

Active Member
Licensed User
Ok ma già in partenza l'idea è "sbagliata", perché occuperesti un mare di memoria, in un array e poi anche nella ScrollView.

Il "modo" migliore sarebbe di scaricare da un server le immagini solo all'occorrenza e visualizzarle solo all'occorrenza.
purtroppo servirebbe offline poiche il database è offline, adesso riesco a farlo solo con ListBox solo che non ottengo un effeto Grid View a due colonne..altro consiglio?
 

LucaMs

Expert
Licensed User
Longtime User
ho provato e riesco a scaricarlo dal link...
Sì, ho scritto una cavolata; si scarica ma non si riesce a decomprimerlo.

1601571934625.png
 

LucaMs

Expert
Licensed User
Longtime User
Devi per forza inserire le immagini a runtime? Non puoi creare un db con un tool ed inserirle usando quello? Sarebbe più facile (sorgente meno complicato) e risparmieresti parecchia memoria.

"Carino" il target sdk nel manifest a 44; sei parecchio nel futuro 😄 (il valore giusto, attualmente, è 29).
 

LucaMs

Expert
Licensed User
Longtime User
Eh sì, è inutile avere le immagini nella DirAssets, poi creare un db sul dispositivo e salvarle là.

Usa uno strumento di gestione SQLite (io uso SQLite Personal Expert, gratuito e funziona alla grande), crea db, tabelle e inserisci le immagini.
Poi lo userai per visualizzare le immagini (a questo punto, se proprio non vuoi faticare, usa una semplice xCustomListView, creando un item composto da due ImageView).

Potrei fartelo io, ma poi non saprei come inviarti il file. Non uso il mio DropBox dal 1492, non so nemmeno se esista ancora 😄


(senza contare che sarebbe ora che sviluppassi anche roba mia! Fate un sondaggio: volete farmi lavorare voi - e pagarmi, ovviamente? 😄 )
 

Matteo Granatiero

Active Member
Licensed User
Devi per forza inserire le immagini a runtime? Non puoi creare un db con un tool ed inserirle usando quello? Sarebbe più facile (sorgente meno complicato) e risparmieresti parecchia memoria.

"Carino" il target sdk nel manifest a 44; sei parecchio nel futuro 😄 (il valore giusto, attualmente, è 29).
non è il mio progetto, non ho aperto il Manifest poichè non mi interessava ahaha
 

Matteo Granatiero

Active Member
Licensed User
Eh sì, è inutile avere le immagini nella DirAssets, poi creare un db sul dispositivo e salvarle là.

Usa uno strumento di gestione SQLite (io uso SQLite Personal Expert, gratuito e funziona alla grande), crea db, tabelle e inserisci le immagini.
Poi lo userai per visualizzare le immagini (a questo punto, se proprio non vuoi faticare, usa una semplice xCustomListView, creando un item composto da due ImageView).

Potrei fartelo io, ma poi non saprei come inviarti il file. Non uso il mio DropBox dal 1492, non so nemmeno se esista ancora 😄


(senza contare che sarebbe ora che sviluppassi anche roba mia! Fate un sondaggio: volete farmi lavorare voi - e pagarmi, ovviamente? 😄 )
non credo sia la soluzione per me poichè poi dovrei ricavarne l'evento "ItemClick" da ogni ImgView
 

Polaris

Member
Licensed User
Ciao Matteo,
Ho visto per caso questo post oggi , Un pò di tempo fa ci ho provato anch' io a fare la stessa cosa che vorresti fare tu , ma in effetti non toverai molto su come visualizzare dentro una GridView (o una ListView) un immagine pescata da un Sql, perchè come dice Luca, l'idea è "sbagliata" .
Come già sai i dati strutturati di un file qualsiasi devono esssere convertiti in semplici byte ( BLOB) prima di poter essere conservati in un Sql. Dunque se hai un BLOB che contiene i dati realtivi ad una immagine, prima di poterla visualizzare i dati devono essere riconvertiti nel file originale. Questo file poi dev'essere salvato da qualche parte, e finchè si tratta di una sola immagine magari lo puoi lasciare nella Ram. Ma se le immagini sono tanti , come si presuppone lo siano in una ListView o una GridView , tenere tutto nella Ram non è fattibile , pertanto questi file dovranno essere salvati nel file system ( cioè in una cartella del disco fisso) . A questo punto ti trovi i dati relativi alle tue immagini sia nel Sql che nel file system. La cosa sarebbe anche fattibile, ma se le immagini sono tanti ti trovi a sprecare inutilmente risorse di CPU e di memoria convertendo Blob in PNG e salvandoli sul disco fisso, per poi utilizzare ulteriore risorse quando hai finito, per cancellare i file dal disco fisso.
Per questo motivo in genere non si salvano i Bitmap, JPEG, PNG etc in un DataBase Sql . I file vengono salvati direttamente nel file system nel loro formato originale, poi nel DataBase Sql si mette il link diretto o il path dove si trova l' immagine. Questa è la soluzione più efficiente, ed è utilizzata da data base che hanno anche decine di migliaia di immagini.
 

Matteo Granatiero

Active Member
Licensed User
Ciao Matteo,
Ho visto per caso questo post oggi , Un pò di tempo fa ci ho provato anch' io a fare la stessa cosa che vorresti fare tu , ma in effetti non toverai molto su come visualizzare dentro una GridView (o una ListView) un immagine pescata da un Sql, perchè come dice Luca, l'idea è "sbagliata" .
Come già sai i dati strutturati di un file qualsiasi devono esssere convertiti in semplici byte ( BLOB) prima di poter essere conservati in un Sql. Dunque se hai un BLOB che contiene i dati realtivi ad una immagine, prima di poterla visualizzare i dati devono essere riconvertiti nel file originale. Questo file poi dev'essere salvato da qualche parte, e finchè si tratta di una sola immagine magari lo puoi lasciare nella Ram. Ma se le immagini sono tanti , come si presuppone lo siano in una ListView o una GridView , tenere tutto nella Ram non è fattibile , pertanto questi file dovranno essere salvati nel file system ( cioè in una cartella del disco fisso) . A questo punto ti trovi i dati relativi alle tue immagini sia nel Sql che nel file system. La cosa sarebbe anche fattibile, ma se le immagini sono tanti ti trovi a sprecare inutilmente risorse di CPU e di memoria convertendo Blob in PNG e salvandoli sul disco fisso, per poi utilizzare ulteriore risorse quando hai finito, per cancellare i file dal disco fisso.
Per questo motivo in genere non si salvano i Bitmap, JPEG, PNG etc in un DataBase Sql . I file vengono salvati direttamente nel file system nel loro formato originale, poi nel DataBase Sql si mette il link diretto o il path dove si trova l' immagine. Questa è la soluzione più efficiente, ed è utilizzata da data base che hanno anche decine di migliaia di immagini.
ero inattivo da molto tempo, mi verrebbe da dire PERCHE NON CI HO PENSATO PRIMA a questa idea cosi semplice? Avrei gia risolto da un pezzo ahahah :eek:😂
Grazie per la tua condivisione!
 
Top