Can't insert into room database because of var initialization Android

840 Views Asked by At

I'm trying to make an Android application using Kotlin, Room Database and both view model and view model factory.

The issue is that when I try to create the object of the entity I am trying to insert, I just get this warning (which i think in this case makes no sense): Dialog with warning "unexpected tokens (Use ';' to separate expressions on the same line)"

Anyway, here are my Fragment, FragmentViewModel, FragmentViewModelFactory, Entity, Dao and Database files (or relevant parts):

Fragment:

class RegisterFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val binding = DataBindingUtil.inflate<RegisterFragmentBinding>(
            inflater,
            R.layout.register_fragment,
            container,
            false
        )

        val application = requireNotNull(this.activity).application
        val dataSource = NbaCafeDB.getInstance(application).usuariDao
        val viewModelFactory = RegisterViewModelFactory(dataSource, application)

        val registerViewModel =
            ViewModelProvider(this, viewModelFactory).get(RegisterViewModel::class.java)

        binding.setLifecycleOwner(this)
        ...
        binding.endavantButton.setOnClickListener { View ->
            val email = binding.email.text.toString()
            val username = binding.registerUser.text.toString()
            val password = binding.registerPassword.text.toString()
            val confPassword = binding.confirmPassword.text.toString()
            if (email != "" && username != "") {
                if (registerViewModel.userExists(username)) {
                    Toast.makeText(context, "Aquest nom d'usuari ja existeix", Toast.LENGTH_LONG)
                        .show()
                } else if (password == confPassword) {

                    registerViewModel.insert(username, email, password)

                } else {
                    Toast.makeText(context, "Les contrassenyes no coincideixen", Toast.LENGTH_LONG)
                        .show()
                }
            }
        }

FragmentViewModel:

class RegisterViewModel(
    private val dataSource: UsuariDao, application: Application
) : AndroidViewModel(application) {

    fun insert(nomUsuari: String, emailUsuari: String, passUsuari: String) {
        val usuari: Usuari(nomUsuari, emailUsuari, passUsuari)
        viewModelScope.launch {
            dataSource.insert(usuari)
        }
    }

    fun userExists(usuariNom: String): Boolean {
        return dataSource.userExists(usuariNom)
    }
}

FragmentViewModelFactory:

class RegisterViewModelFactory(
    private val dataSource: UsuariDao,
    private val application: Application
) : ViewModelProvider.Factory {
    @Suppress("Unchecked_cast")
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(RegisterViewModel::class.java)) {
            return RegisterViewModel(dataSource, application) as T
        }
        throw IllegalArgumentException("Unknown View Model Class")
    }
}

Entity:

@Entity
data class Usuari(
    @PrimaryKey
    @ColumnInfo(name = "nom_usuari")
    var nomUsuari: String,
    @ColumnInfo(name = "email_usuari")
    var emailUsuari: String,
    @ColumnInfo(name = "password_usuari")
    var passwordUsuari: String
)

DAO:

@Dao
interface UsuariDao {

    @Insert
    suspend fun insert(usuari: Usuari)

    @Query ("SELECT EXISTS(SELECT * FROM Usuari WHERE nomUsuari = :usuariNom)")
    fun userExists(usuariNom: String): Boolean

}

And finally, Database:

@Database(
    entities =
        [Beguda::class,
        Comanda::class,
        Postre::class,
        Sandwich::class,
        Usuari::class],
    version = 3,
    exportSchema = false
)
abstract class NbaCafeDB : RoomDatabase() {

    abstract val begudaDao: BegudaDao
    abstract val comandaDao: ComandaDao
    abstract val postreDao: PostreDao
    abstract val sandwichDao: SandwichDao
    abstract val usuariDao: UsuariDao

    companion object {

        @Volatile
        private var INSTANCE: NbaCafeDB? = null

        fun getInstance(context: Context): NbaCafeDB {
            synchronized(this) {
                var instance = INSTANCE

                if (instance == null) {
                    instance = Room.databaseBuilder(
                        context.applicationContext,
                        NbaCafeDB::class.java,
                        "nba_cafe_database"
                    )
                        .fallbackToDestructiveMigration()
                        .allowMainThreadQueries()
                        .build()
                    INSTANCE = instance
                }
                return instance
            }
        }
    }
}

I hope someone has an answer for this, thanks in advance!!

0

There are 0 best solutions below