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.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()
}

레코드 삭제는 이상입니다.

요약


  • SQLiteOpenHelper 이해
    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

    좋은 웹페이지 즐겨찾기