반응형
Android의 sqlite 데이터베이스에서 이미지를 저장 (비트 맵 이미지)하고 검색하는 방법은 무엇입니까?
내 프로젝트에서 이미지를 sqlite 데이터베이스에 저장하고 Android 에뮬레이터에 표시하기 위해 검색해야합니다. 소켓을 사용하여 Java 클래스에서 얻은 인코딩 된 문자열을 디코딩 한 후 직접 표시하면 이미지가 표시됩니다. 그러나 문자열의 바이트 배열 코드를 데이터 유형 blob으로 sqlite 데이터베이스에 저장 한 다음 getblob()
함수 를 사용하여 다시 검색하면 다른 값이 포함되고이 오류가 발생합니다.
JAVA.lang.NULLPointerException: Factory returns null.
비트 맵 이미지를 sqlite 데이터베이스에 저장하고 sqlite 데이터베이스에서 검색하라는 제안이 필요합니다.
데이터베이스 설정
public class DatabaseHelper extends SQLiteOpenHelper {
// Database Version
private static final int DATABASE_VERSION = 1;
// Database Name
private static final String DATABASE_NAME = "database_name";
// Table Names
private static final String DB_TABLE = "table_image";
// column names
private static final String KEY_NAME = "image_name";
private static final String KEY_IMAGE = "image_data";
// Table create statement
private static final String CREATE_TABLE_IMAGE = "CREATE TABLE " + DB_TABLE + "("+
KEY_NAME + " TEXT," +
KEY_IMAGE + " BLOB);";
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// creating table
db.execSQL(CREATE_TABLE_IMAGE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// on upgrade drop older tables
db.execSQL("DROP TABLE IF EXISTS " + DB_TABLE);
// create new table
onCreate(db);
}
}
데이터베이스에 삽입 :
public void addEntry( String name, byte[] image) throws SQLiteException{
SQLiteDatabase database = this.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(KEY_NAME, name);
cv.put(KEY_IMAGE, image);
database.insert( DB_TABLE, null, cv );
}
데이터 검색 :
byte[] image = cursor.getBlob(1);
노트 :
- Before inserting into database, you need to convert your Bitmap image into byte array first then apply it using database query.
- When retrieving from database, you certainly have a byte array of image, what you need to do is to convert byte array back to original image. So, you have to make use of BitmapFactory to decode.
Below is an Utility class which I hope could help you:
public class DbBitmapUtility {
// convert from bitmap to byte array
public static byte[] getBytes(Bitmap bitmap) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG, 0, stream);
return stream.toByteArray();
}
// convert from byte array to bitmap
public static Bitmap getImage(byte[] image) {
return BitmapFactory.decodeByteArray(image, 0, image.length);
}
}
Further reading
If you are not familiar how to insert and retrieve into a database, go through this tutorial.
If you are working with Android's MediaStore database, here is how to store an image and then display it after it is saved.
on button click write this
Intent in = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
in.putExtra("crop", "true");
in.putExtra("outputX", 100);
in.putExtra("outputY", 100);
in.putExtra("scale", true);
in.putExtra("return-data", true);
startActivityForResult(in, 1);
then do this in your activity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1 && resultCode == RESULT_OK && data != null) {
Bitmap bmp = (Bitmap) data.getExtras().get("data");
img.setImageBitmap(bmp);
btnadd.requestFocus();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] b = baos.toByteArray();
String encodedImageString = Base64.encodeToString(b, Base64.DEFAULT);
byte[] bytarray = Base64.decode(encodedImageString, Base64.DEFAULT);
Bitmap bmimage = BitmapFactory.decodeByteArray(bytarray, 0,
bytarray.length);
}
}
반응형
'Programing' 카테고리의 다른 글
Android에서 방향이 변경 될 때 활동을 다시 시작하지 않는 방법 (0) | 2020.12.07 |
---|---|
지난 2 일 동안 변경된 Git 쇼 파일 (0) | 2020.12.07 |
convertPoint를 사용하여 부모 UIView 내부의 상대 위치 가져 오기 (0) | 2020.12.07 |
빈 문자를 어떻게 표현합니까? (0) | 2020.12.07 |
O (n) 알고리즘이 계산 시간 측면에서 O (n ^ 2)를 초과 할 수 있습니까? (0) | 2020.12.07 |