Kotlin에서 이미지를 데이터베이스에 저장하고 싶습니다.
목적
Kotlin으로 데이터베이스 접속을 하고, 이미지의 추가, 삭제까지를 구현한다.
환경
Android Studio 3.5.2
Build #AI-191.8026.42.35.5977832, built on October 31, 2019
JRE: 1.8.0_202-release-1483-b03 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Windows 10 10.0
Kotlin에서 DB 연결 절차
적절한 클래스 이름으로 Kotlin 파일을 만듭니다.
우선 정의를 작성
DbHelper.kt//テーブル定義
object PhotoTable : BaseColumns {
const val TABLE_NAME = "photo"
const val COLUMN_NAME_BITMAP = "bitmap"
}
//テーブル作成のSQL
private const val SQL_CREATE_PHOTO = "CREATE TABLE ${PhotoTable.TABLE_NAME}" +
" (${BaseColumns._ID} INTEGER PRIMARY KEY," +
" ${PhotoTable.COLUMN_NAME_BITMAP} BLOB NOT NULL)"
//テーブル削除のSQL
private const val SQL_DELETE_PHOTO = "DROP TABLE IF EXISTS ${PhotoTable.TABLE_NAME}"
private const val DATABASE_VERSION = 1
private const val DATABASE_NAME = "Practice.db"
이미지는 바이너리 데이터로 저장되므로 형식은 BLOB입니다.
SQLiteOpenHelper 클래스 상속
DbHelper.ktclass DbHelper(context: Context): SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {
override fun onCreate(db: SQLiteDatabase) {
db.execSQL(SQL_CREATE_PHOTO)
}
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
db.execSQL(SQL_DELETE_PHOTO)
onCreate(db)
}
}
이번에는 최소한 재정의해야하는 Create 및 Upgrade 만 있습니다.
우이
1. 이미지 표시용 ImageView(id:imageView)
2. 이미지 추가 버튼(id:addPhotoButton)
3. 이미지 삭제 버튼(id:deletePhotoButton)
레코드 추가
이미지 추가 버튼 클릭 처리
MainActivity.ktaddPhotoButton.setOnClickListener{
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
intent.addCategory(Intent.CATEGORY_OPENABLE)
intent.type = "image/*"
startActivityForResult(Intent.createChooser(intent,"写真を選択"),CHOOSE_PHOTO)
}
이미지 선택 Activity를 시작합니다.
이미지 선택 후 처리
MainActivity.ktoverride fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if(requestCode == CHOOSE_PHOTO
&& resultCode == Activity.RESULT_OK
&& data != null){
//選択した画像のUriからBitmapを取得
val bitmap = getBitmapFromUri(data.data)
bitmap?:return
//画像表示用のImageViewに表示させときます
imageView.setImageBitmap(bitmap)
//Bitmapをバイナリーに変換してDBに登録します
val values = getContentValues(getBinaryFromBitmap(bitmap))
val db = dbHelper.writableDatabase
photoId = db.insert(PhotoTable.TABLE_NAME, null, values) //レコード追加
db.close()
Toast.makeText(this,"登録しました",Toast.LENGTH_LONG).show()
}
}
//Bitmapを取得
//@param 画像Uri
//@return Bitmap
private fun getBitmapFromUri(uri: Uri?): Bitmap? {
uri?:return null
val parcelFileDescriptor: ParcelFileDescriptor? =
this.contentResolver.openFileDescriptor(uri, "r")
parcelFileDescriptor?:return null
val fileDescriptor: FileDescriptor = parcelFileDescriptor.fileDescriptor
val image: Bitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor)
parcelFileDescriptor.close()
return image
}
//Binaryを取得
//@param Bitmap
//@return Binary
private fun getBinaryFromBitmap(bitmap:Bitmap):ByteArray{
val byteArrayOutputStream = ByteArrayOutputStream()
bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream)
return byteArrayOutputStream.toByteArray()
}
//値セットを取得
//@param URI
//@return 値セット
private fun getContentValues(binary:ByteArray): ContentValues {
return ContentValues().apply {
put("${PhotoTable.COLUMN_NAME_BITMAP}",binary)
}
}
레코드 추가는 이상입니다.
레코드 삭제
이미지 삭제 버튼 클릭 처리
MainActivity.ktdeletePhotoButton.setOnClickListener{
val db = dbHelper.writableDatabase
db.delete(PhotoTable.TABLE_NAME,"_ID = $photoId",null) //レコード削除
db.close()
//画像表示用ImageViewを元のに戻してます
imageView.setImageResource(R.drawable.art)
Toast.makeText(this,"削除しました",Toast.LENGTH_LONG).show()
}
레코드 삭제는 이상입니다.
요약
Android Studio 3.5.2
Build #AI-191.8026.42.35.5977832, built on October 31, 2019
JRE: 1.8.0_202-release-1483-b03 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Windows 10 10.0
Kotlin에서 DB 연결 절차
적절한 클래스 이름으로 Kotlin 파일을 만듭니다.
우선 정의를 작성
DbHelper.kt
//テーブル定義
object PhotoTable : BaseColumns {
const val TABLE_NAME = "photo"
const val COLUMN_NAME_BITMAP = "bitmap"
}
//テーブル作成のSQL
private const val SQL_CREATE_PHOTO = "CREATE TABLE ${PhotoTable.TABLE_NAME}" +
" (${BaseColumns._ID} INTEGER PRIMARY KEY," +
" ${PhotoTable.COLUMN_NAME_BITMAP} BLOB NOT NULL)"
//テーブル削除のSQL
private const val SQL_DELETE_PHOTO = "DROP TABLE IF EXISTS ${PhotoTable.TABLE_NAME}"
private const val DATABASE_VERSION = 1
private const val DATABASE_NAME = "Practice.db"
이미지는 바이너리 데이터로 저장되므로 형식은 BLOB입니다.
SQLiteOpenHelper 클래스 상속
DbHelper.kt
class DbHelper(context: Context): SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {
override fun onCreate(db: SQLiteDatabase) {
db.execSQL(SQL_CREATE_PHOTO)
}
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
db.execSQL(SQL_DELETE_PHOTO)
onCreate(db)
}
}
이번에는 최소한 재정의해야하는 Create 및 Upgrade 만 있습니다.
우이
1. 이미지 표시용 ImageView(id:imageView)
2. 이미지 추가 버튼(id:addPhotoButton)
3. 이미지 삭제 버튼(id:deletePhotoButton)
레코드 추가
이미지 추가 버튼 클릭 처리
MainActivity.kt
addPhotoButton.setOnClickListener{
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
intent.addCategory(Intent.CATEGORY_OPENABLE)
intent.type = "image/*"
startActivityForResult(Intent.createChooser(intent,"写真を選択"),CHOOSE_PHOTO)
}
이미지 선택 Activity를 시작합니다.
이미지 선택 후 처리
MainActivity.kt
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if(requestCode == CHOOSE_PHOTO
&& resultCode == Activity.RESULT_OK
&& data != null){
//選択した画像のUriからBitmapを取得
val bitmap = getBitmapFromUri(data.data)
bitmap?:return
//画像表示用のImageViewに表示させときます
imageView.setImageBitmap(bitmap)
//Bitmapをバイナリーに変換してDBに登録します
val values = getContentValues(getBinaryFromBitmap(bitmap))
val db = dbHelper.writableDatabase
photoId = db.insert(PhotoTable.TABLE_NAME, null, values) //レコード追加
db.close()
Toast.makeText(this,"登録しました",Toast.LENGTH_LONG).show()
}
}
//Bitmapを取得
//@param 画像Uri
//@return Bitmap
private fun getBitmapFromUri(uri: Uri?): Bitmap? {
uri?:return null
val parcelFileDescriptor: ParcelFileDescriptor? =
this.contentResolver.openFileDescriptor(uri, "r")
parcelFileDescriptor?:return null
val fileDescriptor: FileDescriptor = parcelFileDescriptor.fileDescriptor
val image: Bitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor)
parcelFileDescriptor.close()
return image
}
//Binaryを取得
//@param Bitmap
//@return Binary
private fun getBinaryFromBitmap(bitmap:Bitmap):ByteArray{
val byteArrayOutputStream = ByteArrayOutputStream()
bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream)
return byteArrayOutputStream.toByteArray()
}
//値セットを取得
//@param URI
//@return 値セット
private fun getContentValues(binary:ByteArray): ContentValues {
return ContentValues().apply {
put("${PhotoTable.COLUMN_NAME_BITMAP}",binary)
}
}
레코드 추가는 이상입니다.
레코드 삭제
이미지 삭제 버튼 클릭 처리
MainActivity.kt
deletePhotoButton.setOnClickListener{
val db = dbHelper.writableDatabase
db.delete(PhotoTable.TABLE_NAME,"_ID = $photoId",null) //レコード削除
db.close()
//画像表示用ImageViewを元のに戻してます
imageView.setImageResource(R.drawable.art)
Toast.makeText(this,"削除しました",Toast.LENGTH_LONG).show()
}
레코드 삭제는 이상입니다.
요약
htps : //에서 ゔぇぺぺr. 안 d로이 d. 코 m / 레후 렌세 / 코 t ぃ / 안 d 로이 d / 다타바세 / sq ぃ 테 / SQ ぃ 테오 펜 헤르
덧붙여서, 바이너리를 비트 맵으로 변환 할 때
val binary = //DBから取得したBinary
val bitmap = BitmapFactory.decodeByteArray(binary,0,binary.size)
에서 얻을 수 있습니다.
참고한 사이트와 소스 코드
참고 사이트
htps : //로 ゔぇぺぺr. 안 d로이 d. 이 m / t 라이 마늘 g / data - s toshu / sq? hl = 그럼
소스 코드
htps : // 기주 b. 코 m / 62 또는 3 / Databaseko t
마지막으로
보충이라는 형태로 새롭게 기사를 투고했습니다.
함께 읽어주세요.
htps : // m / 62 또는 3 / ms / 573dbf84b41013에 d9812
Reference
이 문제에 관하여(Kotlin에서 이미지를 데이터베이스에 저장하고 싶습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/date62noka3/items/42f971fb0ee1be2970e8
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Kotlin에서 이미지를 데이터베이스에 저장하고 싶습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/date62noka3/items/42f971fb0ee1be2970e8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)