2013-04-26 5 views
12

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?

+0

Forse si è tentato di usarlo? – Luksprog

+0

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

risposta

21

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); 
+0

grazie per la tua guida, ci proverò :) – Tamas

+0

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

+0

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