Vorrei archiviare le mie immagini in un db sqlite, in blob-s, e magari crittografarle. È possibile utilizzare Android-Universal-Image-Loader con immagini da un database SQLite?Il caricatore di immagini universali per Android può funzionare con immagini da sqlite db?
risposta
UIL non supporta immagini di SQLite DB fuori dalla scatola. Ma puoi aggiungere tu stesso questo supporto, devi solo creare un nuovo nome schema/protocollo (ad esempio db: //), implementare il proprio ImageDownloader
e impostarlo sulla configurazione.
Ad esempio:
Lets scegliere proprio schema db
così i nostri URI sarà simile "db: // ...".
Quindi implementare ImageDownloader
. Dovremmo prendere gli URI con il nostro schema, analizzarlo, trovare i dati necessari in DB e creare InputStream
per questo (può essere ByteArrayInputStream
).
public class SqliteImageDownloader extends BaseImageDownloader {
private static final String SCHEME_DB = "db";
private static final String DB_URI_PREFIX = SCHEME_DB + "://";
public SqliteImageDownloader(Context context) {
super(context);
}
@Override
protected InputStream getStreamFromOtherSource(String imageUri, Object extra) throws IOException {
if (imageUri.startsWith(DB_URI_PREFIX)) {
String path = imageUri.substring(DB_URI_PREFIX.length());
// Your logic to retreive needed data from DB
byte[] imageData = ...;
return new ByteArrayInputStream(imageData);
} else {
return super.getStreamFromOtherSource(imageUri, extra);
}
}
}
Poi abbiamo impostato questo ImageLoader
alla configurazione:
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
...
.imageDownloader(new SqliteImageDownloader(context))
.build();
ImageLoader.getInstance().init(config);
E poi possiamo fare segue per visualizzare l'immagine da DB:
imageLoader.displayImage("db://mytable/13", imageView);
grazie per la tua guida, ci proverò :) – Tamas
Ok, l'ho appena fatto e funziona benissimo sui telefoni più deboli, ad esempio l'asso della galassia, ci vogliono circa 20ms per caricare un'immagine da 10K da db. Ma quando eseguo lo stesso codice su nexus 4 o galaxy s3, ci vogliono circa 1-3 SECONDI per caricare la stessa immagine 10k :) qualche idea del perché questo sarebbe il caso? – Tamas
Per eseguire la conversione, il mio codice è uguale a quello incollato, tranne che una riga che doveva essere sostituita: byte [] imageData = db.getImageData (imageId); La lettura db richiede circa 4-10 ms sul nexus 4, ma la visualizzazione dell'immagine richiede 1-3 secondi. Oltre alle impostazioni di imagedownloader, sto usando le impostazioni predefinite ovunque. – Tamas
Forse si è tentato di usarlo? – Luksprog
Lo sto usando ora per caricare solo immagini dal file system. Non ho visto alcun metodo nei documenti o nella sorgente che accetti un byte [] come input. Quando carico la bitmap dal db, restituirebbe un byte [] .. – Tamas