2013-04-26 4 views
12

Ich möchte meine Bilder in einer sqlite db, in Blob-s speichern und sie vielleicht verschlüsseln. Ist es möglich, den Android-Universal-Image-Loader mit Bildern aus einer SQLite-Datenbank zu verwenden?Kann Universal Image Loader für Android mit Bildern von SQLite db arbeiten?

+0

Hast du es versucht mit? – Luksprog

+0

Ich benutze es jetzt, um nur Bilder aus dem Dateisystem zu laden. Ich sah keine Methoden in den Dokumenten oder die Quelle, die ein Byte [] als Eingabe akzeptieren würde. Wenn ich die Bitmap von der DB lade, würde das ein Byte [] zurückgeben. – Tamas

Antwort

21

UIL unterstützt keine Bilder von SQLite DB out of the box. Aber Sie können diese Unterstützung selbst hinzufügen, Sie brauchen nur einen neuen Schema-/Protokollnamen (z. B. db: //), implementieren Sie eigene ImageDownloader und setzen Sie es auf Konfiguration.

Zum Beispiel:

Lets eigenen Schema wählen db so unsere URIs wie aussehen wird "db: // ...".

Dann implementieren Sie ImageDownloader. Wir sollten URIs mit unserem Schema fangen, es analysieren, benötigte Daten in DB finden und InputStream dafür erstellen (es kann ByteArrayInputStream sein).

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); 
     } 
    } 
} 

Dann setzen wir diese ImageLoader zur Konfiguration:

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context) 
     ... 
     .imageDownloader(new SqliteImageDownloader(context)) 
     .build(); 

ImageLoader.getInstance().init(config); 

Und dann können wir von DB folgenden anzuzeigen Bild machen:

imageLoader.displayImage("db://mytable/13", imageView); 
+0

danke für Ihre Anleitung, ich werde das versuchen :) – Tamas

+0

Ok, ich habe das getan, und es funktioniert zum Beispiel auf schwächeren Handys Das Galaxy Ass dauert etwa 20ms, um ein 10K-Bild von db zu laden. Aber wenn ich den gleichen Code auf dem Nexus 4 oder Galaxy S3 laufen lasse, dauert es etwa 1-3 Sekunden, um das gleiche 10k Bild zu laden :) irgendwelche Ideen, warum dies der Fall wäre? – Tamas

+0

Um zu kalibrieren, ist mein Code der gleiche wie der, den Sie eingefügt haben, außer dass eine Zeile ersetzt werden musste: byte [] imageData = db.getImageData (imageId); Die db-Lesung dauert etwa 4-10ms auf dem Nexus 4, aber die Anzeige dauert 1-3 Sekunden. Abgesehen von den Imagedownloader-Einstellungen verwende ich die Standardeinstellungen überall. – Tamas