2013-04-26 20 views
12

Tôi muốn lưu trữ hình ảnh của tôi trong một db sqlite, trong blob-s, và có thể mã hóa chúng. Có thể sử dụng Android-Universal-Image-Loader với hình ảnh từ cơ sở dữ liệu sqlite không?Trình tải ảnh phổ biến có thể hoạt động trên Android với hình ảnh từ sqlite db không?

+0

Bạn có cố gắng sử dụng nó? – Luksprog

+0

Tôi đang sử dụng nó ngay bây giờ để chỉ tải hình ảnh từ hệ thống tệp. Tôi không thấy bất kỳ phương thức nào trong tài liệu hoặc nguồn sẽ chấp nhận một byte [] làm đầu vào. Khi tôi tải bitmap từ db, điều đó sẽ trả lại một byte [] .. – Tamas

Trả lời

21

UIL không hỗ trợ hình ảnh từ DB SQLite ra khỏi hộp. Nhưng bạn có thể tự thêm hỗ trợ này, bạn chỉ cần tìm tên lược đồ/giao thức mới (ví dụ: db: //), triển khai riêng ImageDownloader và đặt cấu hình đó.

Ví dụ:

Cho phép chọn chương trình riêng db nên URI của chúng ta sẽ trông giống như "db: // ...".

Sau đó triển khai ImageDownloader. Chúng ta nên bắt các URI với lược đồ của chúng ta, phân tích cú pháp nó, tìm dữ liệu cần thiết trong DB và tạo ra InputStream cho nó (nó có thể là 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); 
     } 
    } 
} 

Sau đó, chúng tôi đặt ImageLoader này để cấu hình:

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

ImageLoader.getInstance().init(config); 

Và sau đó chúng ta có thể làm như sau để hiển thị hình ảnh từ DB:

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

cảm ơn bạn đã hướng dẫn, tôi sẽ thử điều đó :) – Tamas

+0

Ok, tôi đã làm điều đó, và nó hoạt động tốt trên điện thoại yếu hơn, ví dụ thiên hà ace, phải mất khoảng 20ms để tải một hình ảnh 10K từ db. Nhưng khi tôi chạy cùng một mã trên nexus 4 hoặc galaxy s3, nó mất khoảng 1-3 GIÂY để tải cùng một hình ảnh 10k :) bất kỳ ý tưởng tại sao điều này sẽ là trường hợp? – Tamas

+0

Để ổn định, mã của tôi giống với mã bạn đã dán, ngoại trừ một dòng cần thay thế: byte [] imageData = db.getImageData (imageId); db đọc mất khoảng 4-10ms trên nexus 4, nhưng hiển thị hình ảnh mất 1-3 giây. Khác với cài đặt trình tải xuống hình ảnh, tôi đang sử dụng cài đặt mặc định ở mọi nơi. – Tamas