-
[Android]SQLite db에 이미지(비트맵,Drawable) 저장(읽기,쓰기) 하는 법Development/Android 2016. 11. 3. 23:03반응형
테스트 환경
안드로이드 버전
6.0.1
기기명(모델)
삼성 갤럭시노트4S-LTE(SM-N916L)
개발 툴
안드로이드 스튜디오 2.1
테스트 날짜
2016. 11. 3.
개발을 하다 보면 DB에 이미지를 저장할 때도 있습니다.
외부DB(mySQL, Oracle 등)에 주로 저장을 많이 하지만 간단히 저장할 때에는 저는 주로 SQLite를 사용합니다. 내부(Local)저장용 DB이기 때문이죠
SQLite에서 이미지를 저장하기 위해서는 Byte[](바이트 배열) 형식으로 변환시켜 이진데이터로 저장합니다. 그리고 이를 꺼내어 쓸 때에는 다시 Bitmap으로 변환하여 사용합니다.
바로 아래 사진이 Byte[](BLOB)로 저장된 데이터입니다.
이것을 비트맵으로 나타내면 다음과 같습니다.
그래서 DB에 저장된 Row를 보게 되면 다음과 같이 저장되어 있는 것을 볼 수 있습니다.
테이블을 만들 때에는 CREATE TABLE 테이블명 icon BLOB 이런 식으로 주시면 됩니다.
그리고 저장할 때에는 byte[]로, 불러올 때에는 byte[] b = cursor.getBlob(i); 이렇게 불러올 수 있습니다.
만약 여러 이미지를 가져와야 한다면 2차원 배열로 쓰시면 됩니다.(byte[][] b)
<이미지 저장하기>
public byte[] getByteArrayFromDrawable(Drawable d) {
Bitmap bitmap = ((BitmapDrawable)d).getBitmap();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] data = stream.toByteArray();
return data;
}위 처럼 소스를 넣으면 Bimap, Drawable 이미지를 db에 byte[](=BLOB)로 변환할 수 있습니다.
compress 포맷 옵션을 Bitmap.CompressFormat.PNG로 하면 배경이 검정색이 아닌 투명으로 저장됩니다.
그러나 포맷옵션을 Bitmap.CompressFormat.JPG로 하면 배경이 검정색으로 저장되니 사용하실 때 참고하세용
JPG와 PNG 차이점은 아래 글을 참고하세요~
http://citynetc.tistory.com/55
appIcon = getByteArrayFromDrawable(getIcon()); SQLiteStatement p = db.compileStatement("INSERT INTO 테이블명 values(?);");
p.bindBlob(1, appIcon);위 소스는 SQLite DB에 저장하는 방법인데요. 이 부분이 매우 중요합니다!! 이것 때문에 시간을 엄청 낭비했다죠..
구글링 해보면 byte[]변환, 비트맵 반환하는 법은 많이 나와있는데 DB에 저장하는 과정은 잘 안나와 있더라구요..
만약 이미지 저장을 INSERT INTO 테이블명 (image) VALUES (바이트로 변환된 변수); <-- 이렇게 하면 저장이 잘 안됩니다.
(byte 한 줄 저장 되더라구요.. 이유는 모르겠네요)
그래서 위 처럼 물음표(?)를 준 다음에 bindBlob()함수를 통해 insert를 해야합니다.
bindBlob(), bindString().. 등이 있는데 앞에 숫자는 몇번째 물음표인지를 의미합니다.
자세한건 아래 링크를 참고하세요^^
<이미지 가져오기>
public Bitmap getAppIcon(byte[] b) {
Bitmap bitmap = BitmapFactory.decodeByteArray(b, 0, b.length);
return bitmap;
}이미지를 가져온 뒤에는 image.setImageDrawable(bitmap); 하시면 끝입니다~!
개발된 앱 정보 보기 : http://citynetc.tistory.com/146
앱 다운로드 : https://play.google.com/store/apps/details?id=com.handykim.nbit.everytimerfree
반응형'Development > Android' 카테고리의 다른 글
[안드로이드]커스텀 다이얼로그 해상도 비율에 맞게 크기 조절하기 (0) 2017.09.29 [Android]안드로이드 - 앱을 설치할 수 없음 505에러 뜨는 원인 (0) 2016.12.24 [Android]안드로이드 앱에 SNS공유 기능 넣기(with 라인) (0) 2016.12.23 [Android]안드로이드 앱에 SNS공유 기능 넣기(with 인스타그램 링크) (9) 2016.12.23 [Android]안드로이드 앱에 SNS공유 기능 넣기(with 트위터 링크) (1) 2016.12.22 [Android]안드로이드 앱에 SNS공유 기능 넣기(with 페이스북 링크) (6) 2016.12.21 [Android]안드로이드 앱에 SNS공유 기능 넣기(with 카카오링크) (2) 2016.12.20 [Android]안드로이드 버전에 따른 AlarmManager 사용법 (6) 2016.09.29 [Android]디바이스 화면 켜기 (0) 2016.09.29 [Android]ViewPager 내부 Fragment와 ListView, Item 갱신하기 (17) 2016.06.10