Como usar o SQLite com Kotlin CRUD
Android Kotlin

Como usar o SQLite com Kotlin CRUD





Nesse tutorial vou escrever como usar o SQLite com Kotlin CRUD então para isso vamos fazer um crud e executar as funções para inserir deletar e atualizar em uma tabela, também vou utilizar uma recyclerview, então veja os passos do tutorial Como criar uma RecyclerView em Kotlin.

Sendo assim vamos criar uma pasta db e uma classe DatabaseHandler assim como na imagem a seguir.

Como usar o SQLite com Kotlin
Pasta db e classe DatabaseHandler.

Logo após criada a pasta e a classe vamos adicionar a pasta model e dentro um arquivo kotlin chamado Pessoa que será uma data class como na imagem a seguir.

Como usar o SQLite com Kotlin
Pasta model e data class Pessoa.

Assim que temos a nossa base criada vamos começar a modificar os arquivos.





Como usar o SQLite com Kotlin CRUD

Então vamos começar criando a data class, como a seguir.

model/Pessoa

package br.com.uware.recyclerview.model

data class Pessoa(
    var id: Int = 0,
    var nome: String = ""
)

Assim que criarmos a data class vamos agora criar o nosso CRUD para depois modificarmos os arquivos necessários para que ele funcione no aplicativo.

db/DatabaseHandler

package br.com.uware.recyclerview.db

import android.content.ContentValues
import android.content.Context
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
import br.com.uware.recyclerview.model.Pessoa

class DatabaseHandler (ctx: Context): SQLiteOpenHelper(ctx,DB_NAME,null,DB_VERSION) {

    override fun onCreate(db: SQLiteDatabase?) {
        val CREATE_TABLE =
            "CREATE TABLE $TABLE_NAME ($ID INTEGER PRIMARY KEY, $NAME TEXT);"
        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 addPessoa(pessoa: Pessoa): Boolean{
        val db = this.writableDatabase
        val values = ContentValues()
        values.put(NAME, pessoa.nome)
        val _success = db.insert(TABLE_NAME,null,values)
        return (("$_success").toInt() != -1)
    }

    fun getPessoa(_id: Int): Pessoa {
        val pessoa = Pessoa()
        val db = writableDatabase
        val selectQuery = "SELECT * FROM $TABLE_NAME WHERE $ID = $_id"
        val cursor = db.rawQuery(selectQuery, null)
        cursor?.moveToFirst()
        pessoa.id = cursor.getInt(cursor.getColumnIndex(ID))
        pessoa.nome = cursor.getString(cursor.getColumnIndex(NAME))
        cursor.close()
        return pessoa
    }

    fun pessoas(): ArrayList<Pessoa> {
        val pessoaList = ArrayList<Pessoa>()
        val db = writableDatabase
        val selectQuery = "SELECT * FROM $TABLE_NAME"
        val cursor = db.rawQuery(selectQuery, null)
        if(cursor != null){
            if(cursor.moveToFirst()){
                do{
                    val pessoa = Pessoa()
                    pessoa.id = cursor.getInt(cursor.getColumnIndex(ID))
                    pessoa.nome = cursor.getString(cursor.getColumnIndex(NAME))
                    pessoaList.add(pessoa)
                }while(cursor.moveToNext())
            }
        }
        cursor.close()
        return pessoaList
    }

    fun updatePessoa(pessoa: Pessoa): Boolean{
        val db = this.writableDatabase
        val values = ContentValues().apply {
            put(NAME, pessoa.nome)
        }
        val _success = db.update(TABLE_NAME, values, ID + "=?", arrayOf(pessoa.id.toString())).toLong()
        db.close()
        return ("$_success").toInt() != -1
    }

    fun deletePessoa(_id: Int): Boolean {
        val db = this.writableDatabase
        val _success = db.delete(TABLE_NAME, ID + "=?", arrayOf(_id.toString())).toLong()
        return ("$_success").toInt() != -1
    }

    fun deleteAllPessoa(): Boolean {
        val db = this.writableDatabase
        val _success = db.delete(TABLE_NAME, null,null).toLong()
        db.close()
        return ("$_success").toInt() != -1
    }

    companion object {
        private val DB_VERSION = 1
        private val DB_NAME = "Cadastro_uware"
        private val TABLE_NAME = "Pessoa"
        private val ID = "Id"
        private val NAME = "Nome"
    }
}

Logo após criarmos os arquivos e editarmos eles, vamos agora mudar os arquivos que existem no projeto para que se possa utilizar as funções do CRUD.





Como usar o SQLite com Kotlin CRUD – Arquivos do RecyclerView

Então vamos editar os arquivos e modificar para que fiquem assim como os seguintes.

XML

content_lista

<?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="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginEnd="8dp">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <TextView
            android:id="@+id/tvAdpNome"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Nome"
            android:textSize="18sp"
            android:textColor="#000000"
            android:padding="10dp"
            android:gravity="center"
            android:layout_gravity="center"
            android:layout_weight="1"/>
        <Button
            android:id="@+id/btnAdpDel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="X"
            android:textSize="18sp"
            android:textStyle="bold"
            android:textColor="#FFFFFF"
            android:backgroundTint="#000000"
            android:layout_gravity="center"
            android:layout_weight="1"/>
    </LinearLayout>
</LinearLayout>

Kotlin

MainActivity

package br.com.uware.recyclerview

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.recyclerview.widget.LinearLayoutManager
import br.com.uware.recyclerview.adapter.ListaAdapter
import br.com.uware.recyclerview.db.DatabaseHandler
import br.com.uware.recyclerview.model.Pessoa
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    // Iniciando a RecyclerView
    var listaAdapter: ListaAdapter? = null
    var linearLayoutManager: LinearLayoutManager? = null

    // SQLite
    var pessoaList = ArrayList<Pessoa>()
    var databaseHandler = DatabaseHandler(this)


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        initView()

        btnInsert.setOnClickListener {
            val intent = Intent(this, NameActivity::class.java)
            startActivityForResult(intent,1)
        }
    }

    override fun onResume() {
        super.onResume()
        initView()
    }

    private fun initView(){
        pessoaList = databaseHandler.pessoas()
        listaAdapter = ListaAdapter(pessoaList,this, this::deleteAdapter)
        linearLayoutManager = LinearLayoutManager(this)
        recyclerview.layoutManager = linearLayoutManager
        recyclerview.adapter = listaAdapter
    }
    private fun deleteAdapter(position: Int){
        pessoaList.removeAt(position)
        listaAdapter!!.notifyItemRemoved(position)
    }
}




NameActivity

package br.com.uware.recyclerview

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import br.com.uware.recyclerview.db.DatabaseHandler
import br.com.uware.recyclerview.model.Pessoa
import kotlinx.android.synthetic.main.activity_name.*

class NameActivity : AppCompatActivity() {

    // Database
    val databaseHandler = DatabaseHandler(this)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_name)

        val edit = intent.getBooleanExtra("edit", false)
        val position = intent.getIntExtra("position", 0)
        if(edit){
            val pessoa = databaseHandler.getPessoa(position)
            etNome.setText(pessoa.nome)
            btnInsertNome.setText("Editar")
        }
        btnInsertNome.setOnClickListener {
            if(etNome.text.toString() == ""){
                Toast.makeText(this,"Nome está vazio.",Toast.LENGTH_SHORT).show()
            }
            else {
                if(edit){
                    val pessoa = Pessoa(position, etNome.text.toString())
                    databaseHandler.updatePessoa(pessoa)
                    finish()
                }
                else {
                    val pessoa = Pessoa(0, etNome.text.toString())
                    databaseHandler.addPessoa(pessoa)
                    finish()
                }
            }
        }
        btnCancel.setOnClickListener {
            finish()
        }
    }
}

ListaAdapter

package br.com.uware.recyclerview.adapter

import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import br.com.uware.recyclerview.NameActivity
import br.com.uware.recyclerview.R
import br.com.uware.recyclerview.db.DatabaseHandler
import br.com.uware.recyclerview.model.Pessoa
import kotlinx.android.synthetic.main.content_lista.view.*

class ListaAdapter (nameList: List<Pessoa>, internal var ctx: Context, private val callbacks: (Int) -> Unit): RecyclerView.Adapter<ListaAdapter.ViewHolder>() {

    internal var nameList: List<Pessoa> = ArrayList<Pessoa>()
    init {
        this.nameList = nameList
    }

    // Aqui é onde o viewholder é criado a partir do layout
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(ctx).inflate(R.layout.content_lista, parent, false)
        return ViewHolder(view)
    }

    // Nessa parte é onde se modifica o item do viewholder
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val name = nameList[position]

        holder.name.text = name.nome
        if(position % 2 == 0) holder.name.setBackgroundColor(Color.GRAY)
        else holder.name.setBackgroundColor(Color.WHITE)
        holder.name.setOnClickListener {
            val intent = Intent(ctx, NameActivity::class.java)
            intent.putExtra("edit", true)
            intent.putExtra("position", name.id)
            ctx.startActivity(intent)
        }
        holder.btn.setOnClickListener {
            val databaseHandler = DatabaseHandler(ctx)
            databaseHandler.deletePessoa(name.id)
            callbacks(position)
        }
    }

    // Devolve quantidade de itens do nameList
    override fun getItemCount(): Int {
        return nameList.size
    }

    // Aqui é a criação dos itens do viewholder
    inner class ViewHolder(view: View): RecyclerView.ViewHolder(view){
        var name: TextView = view.tvAdpNome
        var btn: Button = view.btnAdpDel
    }
}

Depois que fizer as mudanças é só executar o projeto e ver que o SQLite está funcionando.





Rodrigo Leutz
Desenvolvedor Web e Android ( Kotlin e Java )
https://uware.com.br