-
SQLite 실습1-2Android_Kotlin/Android_공부 2023. 7. 31. 12:35728x90
앞서서 SQLite실습 1-1 에서 작성하한 코드에 이벤트 처리하는 코드를 추가하겠습니다.
MyDBHelper클래스 코드를 수정해줍니다.
package com.example.myapplication0515 import android.content.ContentValues import android.content.Context import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteOpenHelper import android.database.Cursor import android.graphics.Color import android.view.Gravity import android.widget.TableRow import android.widget.TextView import android.widget.TableRow.LayoutParams class MyDBHelper(val context: Context?) : SQLiteOpenHelper(context, DB_NAME, null, DB_VERSION) { companion object{ val DB_NAME ="mydb.db" val DB_VERSION=1 val TABLE_NAME="products" val PID ="pid" val PNAME = "pname" val PQUANTITY="pquantity" } fun getAllRecord(){ val strsql ="select * from $TABLE_NAME;" val db=readableDatabase val cursor=db.rawQuery(strsql,null) showRecord(cursor) cursor.close() db.close() } private fun showRecord(cursor: Cursor) { cursor.moveToFirst() val recordCOunt = cursor.count val attrcount=cursor.columnCount val activity = context as MainActivity activity.binding.tableLayout.removeAllViewsInLayout() //타이를 만들기 val tablerow= TableRow(activity) val rowParam=TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT,TableRow.LayoutParams.WRAP_CONTENT) tablerow.layoutParams=rowParam val viewParam = TableRow.LayoutParams(0,100,1f) for(i in 0 until attrcount) { val textView = TextView(activity) textView.layoutParams= viewParam textView.text = cursor.getColumnName(i) textView.setBackgroundColor(Color.LTGRAY) textView.textSize = 15.0f textView.gravity = Gravity.CENTER tablerow.addView(textView) } activity.binding.tableLayout.addView(tablerow) if(cursor.count==0) return //레코드 추기하기 do{ val row = TableRow(activity) row.layoutParams=rowParam for(i in 0 until attrcount) { val textView = TextView(activity) textView.layoutParams= viewParam textView.text = cursor.getString(i) textView.textSize = 15.0f textView.gravity = Gravity.CENTER row.addView(textView) } activity.binding.tableLayout.addView(row) }while (cursor.moveToNext()) } fun insertProduct(product: Product):Boolean{ val values = ContentValues() values.put(PNAME,product.pName) values.put(PQUANTITY,product.pQuantity) val db=writableDatabase val flag = db.insert(TABLE_NAME,null,values)>0 db.close() return flag } //테이블 생성 override fun onCreate(db: SQLiteDatabase?) { val create_table = "create table if not exists $TABLE_NAME("+ "$PID integer primary key autoincrement, "+ "$PNAME text, " + "$PQUANTITY integer);" db!!.execSQL(create_table) } //업그래드하는 기능 override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) { val drop_table ="drop table if exists $TABLE_NAME;" db!!.execSQL(drop_table) onCreate(db) } fun findProduct(name: String): Boolean { val strsql = "select * from $TABLE_NAME where $PNAME = '$name';" val db=readableDatabase val cursor=db.rawQuery(strsql,null) val flag = cursor.count!=0 showRecord(cursor) cursor.close() db.close() return flag } }
해당 부분에
row.setOnClickListener { for(i in 0 until attrcount){ val textView=row.getChildAt(i) as TextView when(textView.tag){ 0->activity.binding.pIdEdit.setText(textView.text) 1->activity.binding.pNameEdit.setText(textView.text) 2->activity.binding.pQuantityEdit.setText(textView.text) } } }
해당 콜백함수를 추가 해줍니다.
또한 textview의 식별을위해 식별자 역할을 하는 해당 코드를 추가 해줍니다.
textView.tag=i
해당코드를 추가하면 raw를 클릭시 입력창에 해당 raw의 정보가 나타나게 됩니다.
이 기능을 통해 raw에 대한 편집이 간편해 질 수 있습니다.
다음으로는 FIND,UPDATE 등의 버튼 기능 구현을 해보겠습니다.
FIND 버튼 구현
먼저 MainActivity 클래스에서 deletebtn.setOnClickListener{} 의 기능을 구현해 줍니다.
deletebtn.setOnClickListener { val pid = pIdEdit.text.toString() val result = myDBHelper.deleteProduct(pid) if(result){ Toast.makeText(this@MainActivity,"Data DELETE SUCCESS",Toast.LENGTH_SHORT).show() }else{ Toast.makeText(this@MainActivity,"Data DELETE FAILED",Toast.LENGTH_SHORT).show() } getAllRecord() clearEditText() }
MyDBHelper 클래스에는 아래와 같은 코드를 작성해 줍니다.
fun deleteProduct(pid: String): Boolean { val strsql = "select * from $TABLE_NAME where $PID = '$pid';" val db=writableDatabase val cursor=db.rawQuery(strsql,null) val flag = cursor.count!=0 if(flag){ cursor.moveToFirst() db.delete(TABLE_NAME,"$PID=?", arrayOf(pid)) } showRecord(cursor) cursor.close() db.close() return flag }
설명 :해당 코드는 deleteProduct 메소드를 작성하는 코드이며 이 메소드는 주어진 pid를 사용하여 데이터베이스의 특정 레코드를 삭제하는 기능을 수행합니다. 해당 pid를 가진 레코드가 존재하는 경우에만 삭제 작업을 수행하며, 그렇지 않은 경우에는 삭제를 수행하지 않고 false를 반환합니다.
UPDATE 버튼 구현
MainActivity 클래스에서 updatebtn.setOnClickListener{} 의 기능을 구현해 줍니다.
updatebtn.setOnClickListener { val pid = pIdEdit.text.toString().toInt() val name = pNameEdit.text.toString() val quantity = pQuantityEdit.text.toString().toInt() val product=Product(pid,name,quantity) val result = myDBHelper.updateProduct(product) if(result){ getAllRecord() Toast.makeText(this@MainActivity,"Data UPDATE SUCCESS",Toast.LENGTH_SHORT).show() }else{ Toast.makeText(this@MainActivity,"Data UPDATE FAILED",Toast.LENGTH_SHORT).show() } clearEditText() }
해당 코드를통해 updatebtn.setOnClickListener 콜백함수를 구현해줍니다.
MyDBHelper 클래스에는 아래와 같은 코드를 작성해 줍니다.
fun updateProduct(product: Product): Boolean { val pid = product.pId val strsql = "select * from $TABLE_NAME where $PID = '$pid';" val db=writableDatabase val cursor=db.rawQuery(strsql,null) val flag = cursor.count!=0 if(flag){ cursor.moveToFirst() val values= ContentValues() values.put(PNAME,product.pName) values.put(PQUANTITY,product.pQuantity) db.update(TABLE_NAME,values,"$PID=?", arrayOf(pid.toString()) ) } cursor.close() db.close() return flag }
설명 : updateProduct 함수는 주어진 ID에 해당하는 제품 레코드가 데이터베이스에 있는지 확인합니다. 레코드가 있는 경우, 제공된 Product 객체의 새로운 값으로 레코드를 업데이트합니다.
- 동작순서
- 함수는 Product 객체를 매개변수로 받습니다. 이 객체에는 업데이트할 제품에 대한 정보가 포함되어 있습니다.
- 함수는 Product 객체에서 pId (제품 ID)를 추출합니다.
- 해당 pId와 일치하는 레코드를 선택하기 위해 SQL 쿼리를 생성합니다.
- writableDatabase를 사용하여 쓰기 가능한 데이터베이스 객체를 얻습니다.
- rawQuery를 사용하여 SQL 쿼리를 실행하고 결과를 담고 있는 Cursor 객체를 반환합니다.
- Cursor가 레코드를 포함하는지 확인합니다 (cursor.count != 0). 레코드가 있는 경우 데이터베이스에 일치하는 제품이 존재하는 것을 의미합니다.
- 일치하는 레코드가 발견된 경우, 커서를 첫 번째 레코드로 이동시킵니다 (cursor.moveToFirst()).
- ContentValues 객체를 생성하고 업데이트된 제품 이름과 수량을 할당합니다.
- SQLiteDatabase의 update 메서드를 사용하여 테이블의 레코드를 업데이트합니다. 테이블 이름, 업데이트할 값이 들어 있는 ContentValues 객체, 조건 ("$PID=?")으로 제품 ID를 인자로 전달합니다.
- 마지막으로, 커서와 데이터베이스를 닫고, 일치하는 레코드를 찾았는지를 나타내는 flag를 반환합니다.
제품명 입력시 해당 제품명에 해당하는 제품의 정보 나열기능 구현
먼저 메인 layout에 EditText를 추가해줍니다.
<EditText android:id="@+id/testsql" android:layout_width="match_parent" android:layout_height="wrap_content" tools:ignore="TouchTargetSizeCheck" />
해당 코드를 TableLayout 위에 추가 해줍니다.
파란색으로 표시된 부분이 레이아웃에 추가된 것을 확인할 수 있습니다.
EditText에 이벤트를 달아주기 위해 MainActivity클래스 중 **init()**함수에서
addTextChangedListener를 구현해주겠습니다..
먼저 MyDBHelper 클래스에 **findProduct2()**라는 새로운 함수를 구현해 줍니다.
해당 함수는
*select * from product where pname like '문%';*
이러한 질의문의 기능을 수행하게 됩니다.
fun findProduct2(name: String): Any { valstrsql ="select * from$TABLE_NAME where$PNAME like '$name%';" valdb=readableDatabase valcursor=db.rawQuery(strsql,null) valflag = cursor.count!=0 showRecord(cursor) cursor.close() db.close() returnflag }
해당 함수를 구현해주면 됩니다.
- findProduct2 동작 과정
- 함수는 제품 이름을 매개변수로 받습니다.
- SQL 쿼리를 생성하기 위해 주어진 이름으로 시작하는 제품을 검색합니다. ("select * from $TABLE_NAME where $PNAME like '$name%';")
- readableDatabase를 사용하여 읽기 전용 데이터베이스 객체를 얻습니다.
- rawQuery를 사용하여 SQL 쿼리를 실행하고 결과를 담고 있는 Cursor 객체를 반환합니다.
- Cursor가 레코드를 포함하는지 확인합니다 (cursor.count != 0). 레코드가 있는 경우 데이터베이스에 일치하는 제품이 존재하는 것을 의미합니다.
- showRecord 함수를 호출하여 검색된 레코드를 화면에 출력합니다.
- 커서와 데이터베이스를 닫고, 일치하는 레코드를 찾았는지를 나타내는 flag를 반환합니다.
마지막으로 MainActivity의 init함수 앞부분에 아래 코드를 작성해주면 됩니다.
testsql.addTextChangedListener{ valpname =it.toString() valresult =myDBHelper.findProduct2(pname) }
실행결과
어플에 목록이 추가되어있습니다.
a를 입력하면 a로 시작하는 항목들만 보여지게 됩니다.
d를 입력하면 d로 시작하는 항목만 보여지는 것을 확인 할 수 있습니다.
'Android_Kotlin > Android_공부' 카테고리의 다른 글
fetchListData() 일반적인 디자인 패턴 (0) 2023.08.08 Fragment와 WebData 활용하기 (0) 2023.08.01 TextInputLayout 사용하기 (0) 2023.08.01 SQLite 실습1-2(추가 : 예외처리) (0) 2023.08.01 SQLite 실습1-1 (0) 2023.07.31 - 동작순서