kotlinでSQLite データベース 使い方
以下の手順となります。
・プロジェクト作成
・レイアウトデザイン作成
・DatabaseHandler作る
・Model クラス作る
・データ追加、更新、削除機能作る
プロジェクト作成
レイアウトデザイン作成
activity_mainでデザイン作成
・ボタンのonClickイベント作る【保存,表示,更新,削除】
・データ表示listview作る
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:orientation="vertical"
tools:context=".MainActivity">
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TableRow>
<TextView
android:text="User Id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_column="1" />
<EditText
android:id="@+id/u_id"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_marginLeft="20sp"
android:layout_marginStart="20sp"
android:width="150px" />
</TableRow>
<TableRow>
<TextView
android:text="User Name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_column="1" />
<EditText
android:id="@+id/u_name"
android:width="200dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_column="2"
android:layout_marginStart="20sp"
android:layout_marginLeft="20sp"/>
</TableRow>
<TableRow>
<TextView
android:text="User Email"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_column="1" />
<EditText
android:id="@+id/u_email"
android:width="200dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_column="2"
android:layout_marginStart="20sp"
android:layout_marginLeft="20sp" />
</TableRow>
</TableLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="350sp"
android:layout_marginTop="20sp">
<ListView
android:id="@+id/listView"
android:layout_width="wrap_content"
android:layout_height="350sp"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="40sp"
android:orientation="horizontal"
android:layout_gravity="center">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Save"
android:onClick="saveRecord"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="View"
android:onClick="viewRecord"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Update"
android:onClick="updateRecord"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Delete"
android:onClick="deleteRecord"/>
</LinearLayout>
</LinearLayout>
DatabaseHandler作る
package com.example.mydatabase
import android.content.Context
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
import android.content.ContentValues
import android.database.Cursor
import android.database.sqlite.SQLiteException
//creating the database logic, extending the SQLiteOpenHelper base class
class DatabaseHandler(context: Context): SQLiteOpenHelper(context,DATABASE_NAME,null,DATABASE_VERSION) {
companion object {
private val DATABASE_VERSION = 1
private val DATABASE_NAME = "EmployeeDatabase"
private val TABLE_CONTACTS = "EmployeeTable"
private val KEY_ID = "id"
private val KEY_NAME = "name"
private val KEY_EMAIL = "email"
}
override fun onCreate(db: SQLiteDatabase?) {
// TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
//creating table with fields
val CREATE_CONTACTS_TABLE = ("CREATE TABLE " + TABLE_CONTACTS + "("
+ KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
+ KEY_EMAIL + " TEXT" + ")")
db?.execSQL(CREATE_CONTACTS_TABLE)
}
override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
// TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
db!!.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS)
onCreate(db)
}
}
Model クラス作る
package com.example.mydatabase
//creating a Data Model Class
class EmpModelClass (var userId: Int, val userName:String , val userEmail: String)
データ追加、更新、削除機能作る
MainActivityでボタンonClickメソットを実装
DatabaseHandlerでデータベースやり取り実装
SAVEボタン
activity_main.xml
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Save"
android:onClick="saveRecord"/>
MainActivity.kt
fun saveRecord(view: View){
val id = u_id.text.toString()
val name = u_name.text.toString()
val email = u_email.text.toString()
val databaseHandler: DatabaseHandler= DatabaseHandler(this)
if(id.trim()!="" && name.trim()!="" && email.trim()!=""){
val status = databaseHandler.addEmployee(EmpModelClass(Integer.parseInt(id),name, email))
if(status > -1){
Toast.makeText(applicationContext,"record save",Toast.LENGTH_LONG).show()
u_id.text.clear()
u_name.text.clear()
u_email.text.clear()
}
}else{
Toast.makeText(applicationContext,"id or name or email cannot be blank",Toast.LENGTH_LONG).show()
}
}
DatabaseHandler.kt
fun addEmployee(emp: EmpModelClass):Long{
val db = this.writableDatabase
val contentValues = ContentValues()
contentValues.put(KEY_ID, emp.userId)
contentValues.put(KEY_NAME, emp.userName)
contentValues.put(KEY_EMAIL,emp.userEmail )
// Inserting Row
val success = db.insert(TABLE_CONTACTS, null, contentValues)
//2nd argument is String containing nullColumnHack
db.close() // Closing database connection
return success
}
VIEWボタン
activity_main.xml
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="View"
android:onClick="viewRecord"/>
MainActivity.kt
fun viewRecord(view: View){
//creating the instance of DatabaseHandler class
val databaseHandler: DatabaseHandler= DatabaseHandler(this)
//calling the viewEmployee method of DatabaseHandler class to read the records
val emp: List<EmpModelClass> = databaseHandler.viewEmployee()
val empArrayId = Array<String>(emp.size){"0"}
val empArrayName = Array<String>(emp.size){"null"}
val empArrayEmail = Array<String>(emp.size){"null"}
var index = 0
for(e in emp){
empArrayId[index] = e.userId.toString()
empArrayName[index] = e.userName
empArrayEmail[index] = e.userEmail
index++
}
//creating custom ArrayAdapter
val myListAdapter = MyListAdapter(this,empArrayId,empArrayName,empArrayEmail)
listView.adapter = myListAdapter
}
DatabaseHandler.kt
fun viewEmployee():List<EmpModelClass>{
val empList:ArrayList<EmpModelClass> = ArrayList<EmpModelClass>()
val selectQuery = "SELECT * FROM $TABLE_CONTACTS"
val db = this.readableDatabase
var cursor: Cursor? = null
try{
cursor = db.rawQuery(selectQuery, null)
}catch (e: SQLiteException) {
db.execSQL(selectQuery)
return ArrayList()
}
var userId: Int
var userName: String
var userEmail: String
if (cursor.moveToFirst()) {
do {
userId = cursor.getInt(cursor.getColumnIndex("id"))
userName = cursor.getString(cursor.getColumnIndex("name"))
userEmail = cursor.getString(cursor.getColumnIndex("email"))
val emp= EmpModelClass(userId = userId, userName = userName, userEmail = userEmail)
empList.add(emp)
} while (cursor.moveToNext())
}
return empList
}
MyListAdapter.kt
package com.example.mydatabase
import android.app.Activity
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.TextView
class MyListAdapter(private val context: Activity, private val id: Array<String>, private val name: Array<String>, private val email: Array<String>)
: ArrayAdapter<String>(context, R.layout.custom_list, name) {
override fun getView(position: Int, view: View?, parent: ViewGroup): View {
val inflater = context.layoutInflater
val rowView = inflater.inflate(R.layout.custom_list, null, true)
val idText = rowView.findViewById(R.id.textViewId) as TextView
val nameText = rowView.findViewById(R.id.textViewName) as TextView
val emailText = rowView.findViewById(R.id.textViewEmail) as TextView
idText.text = "Id: ${id[position]}"
nameText.text = "Name: ${name[position]}"
emailText.text = "Email: ${email[position]}"
return rowView
}
}
custom_list.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/linearLayout">
<TextView
android:id="@+id/textViewId"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Id"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium"/>
<TextView
android:id="@+id/textViewName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Name"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium"/>
<TextView
android:id="@+id/textViewEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Email"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium"/>
</LinearLayout>
UPDATEボタン
activity_main.xml
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Update"
android:onClick="updateRecord"/>
MainActivity.kt
fun updateRecord(view: View){
val dialogBuilder = AlertDialog.Builder(this)
val inflater = this.layoutInflater
val dialogView = inflater.inflate(R.layout.update_dialog, null)
dialogBuilder.setView(dialogView)
val edtId = dialogView.findViewById(R.id.updateId) as EditText
val edtName = dialogView.findViewById(R.id.updateName) as EditText
val edtEmail = dialogView.findViewById(R.id.updateEmail) as EditText
dialogBuilder.setTitle("Update Record")
dialogBuilder.setMessage("Enter data below")
dialogBuilder.setPositiveButton("Update", DialogInterface.OnClickListener { _, _ ->
val updateId = edtId.text.toString()
val updateName = edtName.text.toString()
val updateEmail = edtEmail.text.toString()
//creating the instance of DatabaseHandler class
val databaseHandler: DatabaseHandler= DatabaseHandler(this)
if(updateId.trim()!="" && updateName.trim()!="" && updateEmail.trim()!=""){
//calling the updateEmployee method of DatabaseHandler class to update record
val status = databaseHandler.updateEmployee(EmpModelClass(Integer.parseInt(updateId),updateName, updateEmail))
if(status > -1){
Toast.makeText(applicationContext,"record update",Toast.LENGTH_LONG).show()
}
}else{
Toast.makeText(applicationContext,"id or name or email cannot be blank",Toast.LENGTH_LONG).show()
}
})
dialogBuilder.setNegativeButton("Cancel", DialogInterface.OnClickListener { dialog, which ->
//pass
})
val b = dialogBuilder.create()
b.show()
}
update_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:padding="10dp"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/updateId"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="enter id" />
<EditText
android:id="@+id/updateName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="enter name"/>
<EditText
android:id="@+id/updateEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="enter email"/>
</LinearLayout>
DatabaseHandler.kt
fun updateEmployee(emp: EmpModelClass):Int{
val db = this.writableDatabase
val contentValues = ContentValues()
contentValues.put(KEY_ID, emp.userId)
contentValues.put(KEY_NAME, emp.userName) // EmpModelClass Name
contentValues.put(KEY_EMAIL,emp.userEmail ) // EmpModelClass Email
// Updating Row
val success = db.update(TABLE_CONTACTS, contentValues,"id="+emp.userId,null)
//2nd argument is String containing nullColumnHack
db.close() // Closing database connection
return success
}
DELETEボタン
activity_main.xml
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Delete"
android:onClick="deleteRecord"/>
MainActivity.xml
fun deleteRecord(view: View){
//creating AlertDialog for taking user id
val dialogBuilder = AlertDialog.Builder(this)
val inflater = this.layoutInflater
val dialogView = inflater.inflate(R.layout.delete_dialog, null)
dialogBuilder.setView(dialogView)
val dltId = dialogView.findViewById(R.id.deleteId) as EditText
dialogBuilder.setTitle("Delete Record")
dialogBuilder.setMessage("Enter id below")
dialogBuilder.setPositiveButton("Delete", DialogInterface.OnClickListener { _, _ ->
val deleteId = dltId.text.toString()
//creating the instance of DatabaseHandler class
val databaseHandler: DatabaseHandler= DatabaseHandler(this)
if(deleteId.trim()!=""){
//calling the deleteEmployee method of DatabaseHandler class to delete record
val status = databaseHandler.deleteEmployee(EmpModelClass(Integer.parseInt(deleteId),"",""))
if(status > -1){
Toast.makeText(applicationContext,"record deleted",Toast.LENGTH_LONG).show()
}
}else{
Toast.makeText(applicationContext,"id or name or email cannot be blank",Toast.LENGTH_LONG).show()
}
})
dialogBuilder.setNegativeButton("Cancel", DialogInterface.OnClickListener { _, _ ->
//pass
})
val b = dialogBuilder.create()
b.show()
}
delete_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:padding="10dp"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/deleteId"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="enter id" />
</LinearLayout>
DatabaseHandler.kt
fun deleteEmployee(emp: EmpModelClass):Int{
val db = this.writableDatabase
val contentValues = ContentValues()
contentValues.put(KEY_ID, emp.userId) // EmpModelClass UserId
// Deleting Row
val success = db.delete(TABLE_CONTACTS,"id="+emp.userId,null)
//2nd argument is String containing nullColumnHack
db.close() // Closing database connection
return success
}
サンプルプロジェクト
sampleproject