Custom ContentPrivider 만들기 -2
>> 기존 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> 최종 결과 화면 (참고용)