본문으로 바로가기

Custom ContentPrivider 만들기 -2

category Android_app 2021. 2. 2. 14:54

>> 기존 SQLiteOpenHelper 사용법을 아시면 무난히 이해하실겁니다.
   --> 혹시 모르시는분은 "SQLite을 이용한  custom database  사용하기" 참조하세요.

 

0> 목차
 0-1> 모든 항목 보여주기
 0-2> 특정이름의 항목 보여주기
 0-3> 항목 추가하기
 0-4> 특정 항목 지우기
 0-5> 전체 항목 지우기

 

1> 상세내용
 1-1> 모든 항목 보여주기

val cursor = contentResolver.query(CUSTOM_PRIVIDER_URI,null, null,null,null)

// show all data.
with(cursor!!) {
    if (count > 0){
        while (moveToNext()) {
            val id = getInt(getColumnIndexOrThrow(BaseColumns._ID))
            val score = getInt(getColumnIndexOrThrow(COLUMN_SCORE))
            val name = getString(getColumnIndexOrThrow(COLUMN_NAME))
            logMsg.append("query id =$id name = $name, score = $score \n")
        }
    }
}

 

>> 예외처리 구문은 제외했습니다.

contentResolver.query() 문에 uri 제외하고 null을 대입.



 1-2> 특정이름의 항목 보여주기

// show data which  is matched by editName.
val selection = "${MyOwnDbHelper.MyContract.MyEntry.COLUMN_NAME_TITLE} = ?"
val selectionArgs = arrayOf("${editName.text.toString()}")
val cursor = contentResolver.query(CUSTOM_PRIVIDER_URI, null, selection, selectionArgs, null)

with(cursor!!) {
    if (count > 0) {
        while (moveToNext()) {
            val id = cursor.getInt(getColumnIndexOrThrow(BaseColumns._ID))
            val score = this.getInt(getColumnIndexOrThrow(COLUMN_SCORE))
            val name = getString(getColumnIndexOrThrow(COLUMN_NAME))
        }
    }
}

 

contentResolver.query() 문에 selection, selectionArgs 대입

query() 함수 사용법은 별도로 설명하지 않겠습니다.

EditText UI 에 있는 이름을 가져와서 문자열로 변환후 selectionArgs 에 넣기.

 

 1-3> 항목 추가하기

val name =  editName.text
val score = editScore.text

if(name.isEmpty() || score.isEmpty()){
    Toast.makeText(applicationContext,"name's or score's value is not defined.",Toast.LENGTH_SHORT).show()
}else {
    // Create a new map of values , where column names are the keys
    val values = ContentValues().apply {
          put(MyOwnDbHelper.MyContract.MyEntry.COLUMN_NAME_TITLE, name.toString())
          put(MyOwnDbHelper.MyContract.MyEntry.COLUMN_NAME_SCORE, score.toString().toInt())
    }

    val uri =contentResolver.insert(CUSTOM_PRIVIDER_URI,values)
}

 

contentResolver.insert() 문 사용하면 됩니다.

>> EditText 안에 있는 name 과 score값을 가져와서 ContentValues를 만들고 이를 insert 문
     추가하면 됩니다.

 

 1-4> 특정 항목 지우기

var strName =  editName.text
val projection = arrayOf(BaseColumns._ID,
        MyOwnDbHelper.MyContract.MyEntry.COLUMN_NAME_TITLE,
        MyOwnDbHelper.MyContract.MyEntry.COLUMN_NAME_SCORE )

val selection = "${MyOwnDbHelper.MyContract.MyEntry.COLUMN_NAME_TITLE} = ?"
val selectionArgs = arrayOf("${strName.toString()}")

// find id from COLUMN_NAME_TITLE
val cursor = contentResolver.query(CUSTOM_PRIVIDER_URI,projection,selection,selectionArgs,null)

with(cursor!!) {
    if(cursor.count > 0) {
        while (moveToNext()) {
            val id = getInt(getColumnIndexOrThrow(android.provider.BaseColumns._ID))
            contentResolver.delete( CUSTOM_PRIVIDER_URI,"_id=$id",null)
        }
    }
}

 

>> contentResolver.delete() 문 사용법

EditText 안에 있는 name 값을 가져와서 항목에 해당하는 id를 찾고 delete 문 에 id 에 해당하는 항목을 제거해 줍니다.

 

 1-5> 전체 항목 지우기

   contentResolver.delete(CUSTOM_PRIVIDER_URI, null,null)

>> 1-4번 항목 이해 하시면 이건 뭐.. null 만 넣으면 모든 항목이 지워지네요.

 

2> 정리

contentResolver 를 사용한 query, insert, delete 구문을 사용해 봤습니다.

이부분 "SQLite을 이용한 custom database 사용하기" 와 거의 비슷합니다. 

 

다음은 "다른 앱을 통한  contentResolver 를 사용하기"  해보겠습니다.

 

3> 최종 결과 화면 (참고용)

 

 

반응형