Search code examples
databaseandroid-studiokotlinandroid-room

Database Inspector in Android Studio not showing strings


So i've created a simple database using Kotlin to create a user with some profile data. Thing is, only the integers are shown in the database, not the strings. I tried doing some research, in vain. Please see the image below : only str are shown

Here is the code of my main class file :

package com.ebookfrenzy.splashscreen10

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText

class TestBD : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_test_bd)

    title="TestBD"
    val id  = findViewById<EditText>(R.id.eT_id)
    //val newId : Int = id.text.toString().toInt()

    val nom = findViewById<EditText>(R.id.eT_nom)
    val newNom : String = nom.text.toString()

    val prenom = findViewById<EditText>(R.id.eT_prenom)
    val newPrenom : String = prenom.text.toString()

    val age = findViewById<EditText>(R.id.eT_age)
    //val newAge : Int = age.text.toString().toInt()

    val taille = findViewById<EditText>(R.id.eT_taille)
    //val newTaille : Int = taille.text.toString().toInt()

    val club = findViewById<EditText>(R.id.eT_club)
    val newClub : String = club.text.toString()

    val date_start = findViewById<EditText>(R.id.eT_start_date)
    val newStartDate : String = date_start.text.toString()

    val poids = findViewById<EditText>(R.id.eT_poids)
    //val newPoids : Int = poids.text.toString().toInt()

    val materiel = findViewById<EditText>(R.id.eT_materiel)
    val newMateriel : String = materiel.text.toString()

    val note = findViewById<EditText>(R.id.eT_notelibre)
    val newNote : String = note.text.toString()

    val d_g = findViewById<EditText>(R.id.eT_dg)
    val newDG : String = d_g.text.toString()

    val c_p = findViewById<EditText>(R.id.eT_cp)
    val newCP : String = c_p.text.toString()

    val id_suppr = findViewById<EditText>(R.id.eT_idsuppr)
    //val newIdSuppr : Int = id_suppr.text.toString().toInt()

    val dbManager = DatabaseManager(this)


    val bouton_add : Button = findViewById(R.id.bt_ajout_user)
    val bouton_suppr : Button = findViewById(R.id.bt_suppr_user)

    bouton_add.setOnClickListener {
        dbManager.creerTireur(id.text.toString().toInt(),newNom,newPrenom,age.text.toString().toInt(),newCP,newDG,newStartDate,newClub,poids.text.toString().toInt(),taille.text.toString().toInt(),newNote,newMateriel)
    }

    bouton_suppr.setOnClickListener {
        dbManager.supprimerTireur(id_suppr.text.toString().toInt())
    }



}
}

Here is the code of my DatabaseManager :

package com.ebookfrenzy.splashscreen10

import android.content.Context
import androidx.room.Room

class DatabaseManager(context: Context) {
    private val db = Room.databaseBuilder(
        context.applicationContext,
        AimGeniusDatabase::class.java, "aim_genius_database"
    ).allowMainThreadQueries().build()

private val tireurDao : tireurDao = db.TireurDao()
private val entraineurDao : entraineurDao = db.EntraineurDao()

fun insertTireur(user : DataTireur){
    tireurDao.insertTireur(user)
}

fun creerTireur(
    id: Int,
    nom: String,
    prenom: String,
    age: Int,
    c_p: String,
    d_g: String,
    start_date: String,
    club: String,
    poids: Int,
    taille: Int,
    notelibre: String,
    materiel: String){

    val user = DataTireur(id, nom, prenom, age,c_p,d_g,start_date,club,poids,taille,notelibre,materiel)
    tireurDao.insertTireur(user)
}

fun supprimerTireur(userId : Int){
    val tireur = tireurDao.getTireur(userId)
    tireur?.let {
        tireurDao.deleteTireur(it)
    }
}

}

Here is the code of my entities class file :

package com.ebookfrenzy.splashscreen10

import androidx.room.Entity
import androidx.room.PrimaryKey
import java.util.Date


@Entity(tableName = "Entraineurs")
data class DataEntraineurs(
    @PrimaryKey(autoGenerate = true) val id : Long = 0,
    var ent_nom : String,
    var ent_nb_session : Int,
    var ent_prenom : String
)

@Entity(tableName = "Tireurs")
data class DataTireur(
    @PrimaryKey(autoGenerate = true) val id : Int = 0,
    var tir_nom : String,
    var tir_prenom : String,
    var tir_age : Int,
    var tir_c_p : String,
    var tir_g_d : String,
    var tir_start_date : String,
    var tir_club : String,
    var tir_poids : Int,
    var tir_taille_cm : Int,
    var tir_note_libre : String,
    var tir_materiel : String
)

And finally here is the code of DAO File :

package com.ebookfrenzy.splashscreen10

import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import androidx.room.Update
import com.ebookfrenzy.splashscreen10.model.Entraineurs


@Dao
interface entraineurDao {

//Methodes pour l'entraineur
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertEntraineur(user: DataEntraineurs): Long

@Update
fun updateEntraineur(user: DataEntraineurs)

@Query("SELECT * FROM entraineurs WHERE id =:userId")
fun getEntraineur(userId: Int): DataEntraineurs?

@Delete
fun deleteEntraineur(user: DataEntraineurs)
}

@Dao
interface tireurDao {

//methodes pour le tireur
@Query("SELECT * FROM Tireurs WHERE id =:userId")
fun getTireur(userId: Int): DataTireur?

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertTireur(user: DataTireur): Long

@Update
fun updateTireur(user: DataTireur)

@Delete
fun deleteTireur(user : DataTireur)
}

Thank you for any help ! I appreciate it


Solution

  • Obviously the issue is not a problem inserting a row into the database as this has been done. i.e. App Inspection is showing what is.

    Therefore the issue is likely that you are inserting empty strings. If you place a breakpoint on the line dbManager.creerTireur(id.text.toString().toInt(),newNom,newPrenom,age.text.toString().toInt(),newCP,newDG,newStartDate,newClub,poids.text.toString().toInt(),taille.text.toString().toInt(),newNote,newMateriel)

    and then run in debug mode (the little green bug icon) then you will see something like (see note below re layout):-

    enter image description here

    What is happening is that you are collecting the values before any values have been input i.e. as soon as the layout has been set.

    Fix

    If instead you use:-

        bouton_add.setOnClickListener {
            dbManager.creerTireur(
                id.text.toString().toInt(),
                nom.text.toString(),
                prenom.text.toString(),
                age.text.toString().toInt(),
                c_p.text.toString(),
                d_g.text.toString(),
                date_start.text.toString(),
                club.text.toString(),
                poids.text.toString().toInt(),
                taille.text.toString().toInt(),
                note.text.toString(),
                materiel.text.toString()
            )
        }
    

    i.e. you are THEN retrieving the values WHEN/IMMEDIATELY AFTER THE BUTTON IS CLICKED, for example (see note re layout below):-

    enter image description here

    As such you might as well have the main class file as:-

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    
        title="TestBD"
        val id  = findViewById<EditText>(R.id.eT_id)
        val nom = findViewById<EditText>(R.id.eT_nom)
        val prenom = findViewById<EditText>(R.id.eT_prenom)
        val age = findViewById<EditText>(R.id.eT_age)
        val taille = findViewById<EditText>(R.id.eT_taille)
        val club = findViewById<EditText>(R.id.eT_club)
        val date_start = findViewById<EditText>(R.id.eT_start_date)
        val poids = findViewById<EditText>(R.id.eT_poids)
        val materiel = findViewById<EditText>(R.id.eT_materiel)
        val note = findViewById<EditText>(R.id.eT_notelibre)
        val d_g = findViewById<EditText>(R.id.eT_dg)
        val c_p = findViewById<EditText>(R.id.eT_cp)
        val id_suppr = findViewById<EditText>(R.id.eT_idsuppr)
        val dbManager = DatabaseManager(this)
        val bouton_add : Button = findViewById(R.id.bt_ajout_user)
        val bouton_suppr : Button = findViewById(R.id.bt_suppr_user)
    
        bouton_add.setOnClickListener {
            dbManager.creerTireur(
                id.text.toString().toInt(),
                nom.text.toString(),
                prenom.text.toString(),
                age.text.toString().toInt(),
                c_p.text.toString(),
                d_g.text.toString(),
                date_start.text.toString(),
                club.text.toString(),
                poids.text.toString().toInt(),
                taille.text.toString().toInt(),
                note.text.toString(),
                materiel.text.toString()
            )
        }
    
        bouton_suppr.setOnClickListener {
            dbManager.supprimerTireur(id_suppr.text.toString().toInt())
        }
    }
    
    • i.e. the the new???? fields serve no purpose.

    • NOTE the layout used above was improvised and thus does not match the your layout but effectively mimics the functionality enough to provide the answer.