1

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!!

  • 2
    You should instantiate a new instance of a class with `val usuari = Usuari(nomUsuari, emailUsuari, passUsuari)` – lpizzinidev Dec 18 '21 at 14:08

0 Answers0