2013-04-26 9 views
12

Chciałbym przechowywać moje obrazy w sqlite db, w blob-s, i może szyfrować je. Czy można używać urządzenia Universal Universal Image Advisor z obrazami z bazy danych SQLite?Czy Universal Image Loader dla Androida działa z obrazami z sqlite db?

+0

Czy próbowałeś go używać? – Luksprog

+0

Używam go teraz, aby załadować obrazy z systemu plików. Nie widziałem żadnych metod w dokumentach ani źródle, które akceptowałyby bajt [] jako dane wejściowe. Kiedy załaduję bitmapę z bazy danych, która zwróci bajt [] .. – Tamas

Odpowiedz

21

UIL nie obsługuje obrazów z SQLite DB po wyjęciu z pudełka. Ale możesz dodać to wsparcie samemu, wystarczy wymyślić nową nazwę schematu/protokołu (np. db: //), zaimplementować własną ImageDownloader i ustawić ją w konfiguracji.

Na przykład:

Pozwala wybrać własny system db więc nasze URI będzie wyglądać "db: // ...".

Następnie zaimplementuj ImageDownloader. Powinniśmy wyłapać URI z naszego schematu, przeanalizować go, znaleźć potrzebne dane w DB i utworzyć dla niego InputStream (może to być 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); 
     } 
    } 
} 

Następnie ustawiamy tę ImageLoader do konfiguracji:

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

ImageLoader.getInstance().init(config); 

A potem możemy zrobić następujące czynności, aby wyświetlić obraz z DB:

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

dziękuję za wskazówki, spróbuję tego :) – Tamas

+0

Ok, właśnie to zrobiłem i działa świetnie na słabszych telefonach, na przykład galaktycznego asa, ładowanie obrazu 10K z db zajmuje około 20 ms. Ale kiedy uruchomię ten sam kod na nexusie 4 lub galaktyce s3, ładowanie tego samego obrazu 10k zajmuje około 1-3 SEKUND :) Jakieś pomysły, dlaczego tak się stało? – Tamas

+0

Aby calibrować, mój kod jest taki sam, jak ten, który wkleiłeś, z wyjątkiem tego, że jedna linia musi zostać zastąpiona: byte [] imageData = db.getImageData (imageId); Odczyt db trwa 4-10ms na nexus 4, ale wyświetlenie obrazu zajmuje 1-3 sekundy. Poza ustawieniami imagedownloader, używam ustawień domyślnych wszędzie. – Tamas

Powiązane problemy