Я прогнал свой хвост вокруг на это долгое время. Ответ от deSelby помог мне. Вот мой код, который загружает изображения (PNG и JPG) из Facebook, а затем сохраняет/извлекает данные из таблицы sqlite, используя путь в качестве ссылки.
Как вы можете видеть, он фактически пытается сначала прочитать изображение из таблицы, если он там просто возвращает его, в противном случае он извлекает его из Facebook, сохраняет его в базе данных и затем возвращает.
private static Drawable fetchPhoto(ContentResolver cr, int source, String path) {
Drawable image = null;
myDB mDb = myDB.getInstance();
Cursor iCursor = mDb.fetchImage(cr, path);
if(iCursor != null && iCursor.moveToFirst()) {
byte[] bb = iCursor.getBlob(iCursor.getColumnIndex(Images.IMAGE));
if(iCursor != null) iCursor.close();
image = new BitmapDrawable(BitmapFactory.decodeByteArray(bb, 0, bb.length));
} else {
if(iCursor != null) iCursor.close();
//get image from path
try
{
InputStream is = (InputStream) new URL(path).getContent();
BufferedInputStream bis = new BufferedInputStream(is);
ByteArrayBuffer baf = new ByteArrayBuffer(50);
int current = 0;
while ((current = bis.read()) != -1) {
baf.append((byte) current);
}
byte[] barray = baf.toByteArray();
bis.close();
is.close();
/* write image to db */
long id = mDb.writeImage(cr,source,path,barray);
image = new BitmapDrawable(BitmapFactory.decodeByteArray(barray, 0, barray.length));
}catch (Exception error) {
//System.out.println("Exc="+e);
}
}
return image;
}
My writeImage выглядит так (см. Ниже).
Images.IMAGE ссылается на имя столбца BLOB в моей таблице. Главное, что вы действительно можете написать байт [] непосредственно в столбце BLOB базы данных. Я пишу время (utc), поэтому я могу очистить старые данные в соответствии с политиками api в Facebook для кэширования данных.
public long writeImage(ContentResolver contentResolver, int source, String path, byte[] image) {
Time now = new Time();
now.setToNow();
ContentValues initialValues = new ContentValues();
initialValues.put(Images.IMAGE, image);
initialValues.put(Images.SOURCE, source);
initialValues.put(Images.PATH, path);
initialValues.put(Images.UTC, now.toMillis(false));
if(source == 0) initialValues.put(Images.DIRTY, 1); // sync user created images
Uri newUri = contentResolver.insert(Images.CONTENT_URI, initialValues);
String Id = newUri.getPathSegments().get(1);
return Long.parseLong(Id);
}
Я использую поставщик контента для моей БД, но и для тех, кто не код вставки выглядит так, что вы можете использовать непосредственно в базу данных без поставщика. (Только FYI).
rowId = db.insert(IMAGES_TABLE, null, values);