Black november Você e seu amigo por apenas 49,90 por mês! Saiba mais

Passagem de parâmetros via construtor

25/10/2019

13

Olá pessoal, estou desenvolvendo um trabalho para a faculdade. Fiz esse código em Kotlin, que comecei agora a programar.
Trata-se de um sistema para gerenciar finanças pessoais. Criei uma classe ContaDAO para fazer a inserção de dados de uma Conta bancária em um BD SQLite. Estou na dúvida de como passo os parâmetros da classe ContaDAO para a classe da activity de cadastro da conta via construtor quando instancio objeto desta classe. No java poderia ter feito as classe ContaDAO sem parâmetros no construtor, mas no Kotlin tive que colocar para inicializar as variáveis. Alguém pode ajudar?


class ContaDAO(database: SQLiteDatabase, dbhelper: SQLiteHelperCta){

    var database = database
    var dbhelper = dbhelper

    fun incluirConta(c: Conta){
        database  = dbhelper.writableDatabase
        val values = ContentValues()
        values.put(SQLiteHelperCta.KEY_NOME_CONTA, c.nome)
        values.put(SQLiteHelperCta.KEY_SALDOINICIAL_CONTA, c.saldoinicial)
        values.put(SQLiteHelperCta.KEY_DESCRICAO_CONTA, c.descricao)

        database.insert(SQLiteHelperCta.TABLE_CONTA, null, values)
        database.close()
    }
}


class ContaCadastro: AppCompatActivity(), View.OnClickListener {

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

        var btnSalvarConta = findViewById<Button>(R.id.btnSalvarConta)
        btnSalvarConta.setOnClickListener(this)
    }

    override fun onClick(v: View?) {
        //val id:Int = SQLiteHelperCta.KEY_ID_CONTA
        var nome = editTextNomeConta.text.toString()
        var saldoinicial = editTextSaldoConta.text.toString()
        var descricao = editTextDescricaoConta.text.toString()

        var c = Conta (nome, saldoinicial, descricao)

        var contadao = ContaDAO(??????, ??????)

        contadao.incluirConta(c)
        finish()
    }
}
Responder

Posts

26/10/2019

Daniel Melo

Olá pessoal, estou desenvolvendo um trabalho para a faculdade. Fiz esse código em Kotlin, que comecei agora a programar.
Trata-se de um sistema para gerenciar finanças pessoais. Criei uma classe ContaDAO para fazer a inserção de dados de uma Conta bancária em um BD SQLite. Estou na dúvida de como passo os parâmetros da classe ContaDAO para a classe da activity de cadastro da conta via construtor quando instancio objeto desta classe. No java poderia ter feito as classe ContaDAO sem parâmetros no construtor, mas no Kotlin tive que colocar para inicializar as variáveis. Alguém pode ajudar?


class ContaDAO(database: SQLiteDatabase, dbhelper: SQLiteHelperCta){

    var database = database
    var dbhelper = dbhelper

    fun incluirConta(c: Conta){
        database  = dbhelper.writableDatabase
        val values = ContentValues()
        values.put(SQLiteHelperCta.KEY_NOME_CONTA, c.nome)
        values.put(SQLiteHelperCta.KEY_SALDOINICIAL_CONTA, c.saldoinicial)
        values.put(SQLiteHelperCta.KEY_DESCRICAO_CONTA, c.descricao)

        database.insert(SQLiteHelperCta.TABLE_CONTA, null, values)
        database.close()
    }
}


class ContaCadastro: AppCompatActivity(), View.OnClickListener {

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

        var btnSalvarConta = findViewById<Button>(R.id.btnSalvarConta)
        btnSalvarConta.setOnClickListener(this)
    }

    override fun onClick(v: View?) {
        //val id:Int = SQLiteHelperCta.KEY_ID_CONTA
        var nome = editTextNomeConta.text.toString()
        var saldoinicial = editTextSaldoConta.text.toString()
        var descricao = editTextDescricaoConta.text.toString()

        var c = Conta (nome, saldoinicial, descricao)

        var contadao = ContaDAO(??????, ??????)

        contadao.incluirConta(c)
        finish()
    }
}

Exemplo de instanciação em kotlin com construtor:
class A(num1 : Int, num2 : Int){
var soma : Int
init{
soma = num1 + num2
}
}

fun main(){
val meuObjeto = A(1, 2)
println(meuObjeto.soma)
}
// resultado desse codigo: printa 3 na tela


Responder

26/10/2019

André Freitas

Olá pessoal, estou desenvolvendo um trabalho para a faculdade. Fiz esse código em Kotlin, que comecei agora a programar.
Trata-se de um sistema para gerenciar finanças pessoais. Criei uma classe ContaDAO para fazer a inserção de dados de uma Conta bancária em um BD SQLite. Estou na dúvida de como passo os parâmetros da classe ContaDAO para a classe da activity de cadastro da conta via construtor quando instancio objeto desta classe. No java poderia ter feito as classe ContaDAO sem parâmetros no construtor, mas no Kotlin tive que colocar para inicializar as variáveis. Alguém pode ajudar?


class ContaDAO(database: SQLiteDatabase, dbhelper: SQLiteHelperCta){

    var database = database
    var dbhelper = dbhelper

    fun incluirConta(c: Conta){
        database  = dbhelper.writableDatabase
        val values = ContentValues()
        values.put(SQLiteHelperCta.KEY_NOME_CONTA, c.nome)
        values.put(SQLiteHelperCta.KEY_SALDOINICIAL_CONTA, c.saldoinicial)
        values.put(SQLiteHelperCta.KEY_DESCRICAO_CONTA, c.descricao)

        database.insert(SQLiteHelperCta.TABLE_CONTA, null, values)
        database.close()
    }
}


class ContaCadastro: AppCompatActivity(), View.OnClickListener {

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

        var btnSalvarConta = findViewById<Button>(R.id.btnSalvarConta)
        btnSalvarConta.setOnClickListener(this)
    }

    override fun onClick(v: View?) {
        //val id:Int = SQLiteHelperCta.KEY_ID_CONTA
        var nome = editTextNomeConta.text.toString()
        var saldoinicial = editTextSaldoConta.text.toString()
        var descricao = editTextDescricaoConta.text.toString()

        var c = Conta (nome, saldoinicial, descricao)

        var contadao = ContaDAO(??????, ??????)

        contadao.incluirConta(c)
        finish()
    }
}

Exemplo de instanciação em kotlin com construtor:
class A(num1 : Int, num2 : Int){
var soma : Int
init{
soma = num1 + num2
}
}

fun main(){
val meuObjeto = A(1, 2)
println(meuObjeto.soma)
}
// resultado desse codigo: printa 3 na tela




Meu problema está justamente aí.
Você colocou 1 e 2 como parâmetros da classe A que você criou, algo simples. No meu caso os parâmetros são objetos do tipo SQLitedatabase e SQLiteHelperCta(classe responsável pela criação do banco de dados e tabelas no SQLite)
O mais fácil seria que não houvesse parâmetros, assim como no Java, pois apenas instanciaria a classe ContaDAO e chamaria o método incluirConta(), mas o kotlin me obriga a inicializar as variáveis dentro da classe, o que fiz através do construtor.

Agora, para instanciar a classe ContaDAO eu preciso passar estes dois parâmetros que não sei como fazer. Já tentei Null, mas não aceita.
Responder

26/10/2019

Daniel Melo

Olá pessoal, estou desenvolvendo um trabalho para a faculdade. Fiz esse código em Kotlin, que comecei agora a programar.
Trata-se de um sistema para gerenciar finanças pessoais. Criei uma classe ContaDAO para fazer a inserção de dados de uma Conta bancária em um BD SQLite. Estou na dúvida de como passo os parâmetros da classe ContaDAO para a classe da activity de cadastro da conta via construtor quando instancio objeto desta classe. No java poderia ter feito as classe ContaDAO sem parâmetros no construtor, mas no Kotlin tive que colocar para inicializar as variáveis. Alguém pode ajudar?


class ContaDAO(database: SQLiteDatabase, dbhelper: SQLiteHelperCta){

    var database = database
    var dbhelper = dbhelper

    fun incluirConta(c: Conta){
        database  = dbhelper.writableDatabase
        val values = ContentValues()
        values.put(SQLiteHelperCta.KEY_NOME_CONTA, c.nome)
        values.put(SQLiteHelperCta.KEY_SALDOINICIAL_CONTA, c.saldoinicial)
        values.put(SQLiteHelperCta.KEY_DESCRICAO_CONTA, c.descricao)

        database.insert(SQLiteHelperCta.TABLE_CONTA, null, values)
        database.close()
    }
}


class ContaCadastro: AppCompatActivity(), View.OnClickListener {

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

        var btnSalvarConta = findViewById<Button>(R.id.btnSalvarConta)
        btnSalvarConta.setOnClickListener(this)
    }

    override fun onClick(v: View?) {
        //val id:Int = SQLiteHelperCta.KEY_ID_CONTA
        var nome = editTextNomeConta.text.toString()
        var saldoinicial = editTextSaldoConta.text.toString()
        var descricao = editTextDescricaoConta.text.toString()

        var c = Conta (nome, saldoinicial, descricao)

        var contadao = ContaDAO(??????, ??????)

        contadao.incluirConta(c)
        finish()
    }
}

Exemplo de instanciação em kotlin com construtor:
class A(num1 : Int, num2 : Int){
var soma : Int
init{
soma = num1 + num2
}
}

fun main(){
val meuObjeto = A(1, 2)
println(meuObjeto.soma)
}
// resultado desse codigo: printa 3 na tela




Meu problema está justamente aí.
Você colocou 1 e 2 como parâmetros da classe A que você criou, algo simples. No meu caso os parâmetros são objetos do tipo SQLitedatabase e SQLiteHelperCta(classe responsável pela criação do banco de dados e tabelas no SQLite)
O mais fácil seria que não houvesse parâmetros, assim como no Java, pois apenas instanciaria a classe ContaDAO e chamaria o método incluirConta(), mas o kotlin me obriga a inicializar as variáveis dentro da classe, o que fiz através do construtor.

Agora, para instanciar a classe ContaDAO eu preciso passar estes dois parâmetros que não sei como fazer. Já tentei Null, mas não aceita.


Espera, não sei se entendi direito seu problema, me explica direito, você precisa de um objeto do tipo sqlitedatabase e sqlitehelpercta disponíveis em duas classes diferentes? se for isso não dá pra simplesmente criar dois objetos desses tipos e deixar eles disponíveis globalmente? Exemplo:

var a = 3 // variável disponível globalmente
var b = 2 // variável disponível globalmente
class A{
    fun imprimir() = println(a + b) // usa as variáveis disponíveis globalmente
}
class B{
    fun imprimir() = println(a - b) // usa as variáveis disponíveis globalmente
}

fun main() {
    val a = A()
    val b = B()
    a.imprimir()
    b.imprimir()
// printa 5 e 1
}
Responder

26/10/2019

André Freitas

Olá pessoal, estou desenvolvendo um trabalho para a faculdade. Fiz esse código em Kotlin, que comecei agora a programar.
Trata-se de um sistema para gerenciar finanças pessoais. Criei uma classe ContaDAO para fazer a inserção de dados de uma Conta bancária em um BD SQLite. Estou na dúvida de como passo os parâmetros da classe ContaDAO para a classe da activity de cadastro da conta via construtor quando instancio objeto desta classe. No java poderia ter feito as classe ContaDAO sem parâmetros no construtor, mas no Kotlin tive que colocar para inicializar as variáveis. Alguém pode ajudar?


class ContaDAO(database: SQLiteDatabase, dbhelper: SQLiteHelperCta){

    var database = database
    var dbhelper = dbhelper

    fun incluirConta(c: Conta){
        database  = dbhelper.writableDatabase
        val values = ContentValues()
        values.put(SQLiteHelperCta.KEY_NOME_CONTA, c.nome)
        values.put(SQLiteHelperCta.KEY_SALDOINICIAL_CONTA, c.saldoinicial)
        values.put(SQLiteHelperCta.KEY_DESCRICAO_CONTA, c.descricao)

        database.insert(SQLiteHelperCta.TABLE_CONTA, null, values)
        database.close()
    }
}


class ContaCadastro: AppCompatActivity(), View.OnClickListener {

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

        var btnSalvarConta = findViewById<Button>(R.id.btnSalvarConta)
        btnSalvarConta.setOnClickListener(this)
    }

    override fun onClick(v: View?) {
        //val id:Int = SQLiteHelperCta.KEY_ID_CONTA
        var nome = editTextNomeConta.text.toString()
        var saldoinicial = editTextSaldoConta.text.toString()
        var descricao = editTextDescricaoConta.text.toString()

        var c = Conta (nome, saldoinicial, descricao)

        var contadao = ContaDAO(??????, ??????)

        contadao.incluirConta(c)
        finish()
    }
}

Exemplo de instanciação em kotlin com construtor:
class A(num1 : Int, num2 : Int){
var soma : Int
init{
soma = num1 + num2
}
}

fun main(){
val meuObjeto = A(1, 2)
println(meuObjeto.soma)
}
// resultado desse codigo: printa 3 na tela




Meu problema está justamente aí.
Você colocou 1 e 2 como parâmetros da classe A que você criou, algo simples. No meu caso os parâmetros são objetos do tipo SQLitedatabase e SQLiteHelperCta(classe responsável pela criação do banco de dados e tabelas no SQLite)
O mais fácil seria que não houvesse parâmetros, assim como no Java, pois apenas instanciaria a classe ContaDAO e chamaria o método incluirConta(), mas o kotlin me obriga a inicializar as variáveis dentro da classe, o que fiz através do construtor.

Agora, para instanciar a classe ContaDAO eu preciso passar estes dois parâmetros que não sei como fazer. Já tentei Null, mas não aceita.


Espera, não sei se entendi direito seu problema, me explica direito, você precisa de um objeto do tipo sqlitedatabase e sqlitehelpercta disponíveis em duas classes diferentes? se for isso não dá pra simplesmente criar dois objetos desses tipos e deixar eles disponíveis globalmente? Exemplo:

var a = 3 // variável disponível globalmente
var b = 2 // variável disponível globalmente
class A{
    fun imprimir() = println(a + b) // usa as variáveis disponíveis globalmente
}
class B{
    fun imprimir() = println(a - b) // usa as variáveis disponíveis globalmente
}

fun main() {
    val a = A()
    val b = B()
    a.imprimir()
    b.imprimir()
// printa 5 e 1
}


Até tentei fazer, mas na classe das variáveis globais também é necessário inicializá-las via construtor, quando vou instanciar a classe das variáveis globais na ContaDAO também teria que passar parâmetros via construtor, ou seja, caio no mesmo problema.
Responder

26/10/2019

Daniel Melo

Olá pessoal, estou desenvolvendo um trabalho para a faculdade. Fiz esse código em Kotlin, que comecei agora a programar.
Trata-se de um sistema para gerenciar finanças pessoais. Criei uma classe ContaDAO para fazer a inserção de dados de uma Conta bancária em um BD SQLite. Estou na dúvida de como passo os parâmetros da classe ContaDAO para a classe da activity de cadastro da conta via construtor quando instancio objeto desta classe. No java poderia ter feito as classe ContaDAO sem parâmetros no construtor, mas no Kotlin tive que colocar para inicializar as variáveis. Alguém pode ajudar?


class ContaDAO(database: SQLiteDatabase, dbhelper: SQLiteHelperCta){

    var database = database
    var dbhelper = dbhelper

    fun incluirConta(c: Conta){
        database  = dbhelper.writableDatabase
        val values = ContentValues()
        values.put(SQLiteHelperCta.KEY_NOME_CONTA, c.nome)
        values.put(SQLiteHelperCta.KEY_SALDOINICIAL_CONTA, c.saldoinicial)
        values.put(SQLiteHelperCta.KEY_DESCRICAO_CONTA, c.descricao)

        database.insert(SQLiteHelperCta.TABLE_CONTA, null, values)
        database.close()
    }
}


class ContaCadastro: AppCompatActivity(), View.OnClickListener {

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

        var btnSalvarConta = findViewById<Button>(R.id.btnSalvarConta)
        btnSalvarConta.setOnClickListener(this)
    }

    override fun onClick(v: View?) {
        //val id:Int = SQLiteHelperCta.KEY_ID_CONTA
        var nome = editTextNomeConta.text.toString()
        var saldoinicial = editTextSaldoConta.text.toString()
        var descricao = editTextDescricaoConta.text.toString()

        var c = Conta (nome, saldoinicial, descricao)

        var contadao = ContaDAO(??????, ??????)

        contadao.incluirConta(c)
        finish()
    }
}

Exemplo de instanciação em kotlin com construtor:
class A(num1 : Int, num2 : Int){
var soma : Int
init{
soma = num1 + num2
}
}

fun main(){
val meuObjeto = A(1, 2)
println(meuObjeto.soma)
}
// resultado desse codigo: printa 3 na tela




Meu problema está justamente aí.
Você colocou 1 e 2 como parâmetros da classe A que você criou, algo simples. No meu caso os parâmetros são objetos do tipo SQLitedatabase e SQLiteHelperCta(classe responsável pela criação do banco de dados e tabelas no SQLite)
O mais fácil seria que não houvesse parâmetros, assim como no Java, pois apenas instanciaria a classe ContaDAO e chamaria o método incluirConta(), mas o kotlin me obriga a inicializar as variáveis dentro da classe, o que fiz através do construtor.

Agora, para instanciar a classe ContaDAO eu preciso passar estes dois parâmetros que não sei como fazer. Já tentei Null, mas não aceita.


Espera, não sei se entendi direito seu problema, me explica direito, você precisa de um objeto do tipo sqlitedatabase e sqlitehelpercta disponíveis em duas classes diferentes? se for isso não dá pra simplesmente criar dois objetos desses tipos e deixar eles disponíveis globalmente? Exemplo:

var a = 3 // variável disponível globalmente
var b = 2 // variável disponível globalmente
class A{
    fun imprimir() = println(a + b) // usa as variáveis disponíveis globalmente
}
class B{
    fun imprimir() = println(a - b) // usa as variáveis disponíveis globalmente
}

fun main() {
    val a = A()
    val b = B()
    a.imprimir()
    b.imprimir()
// printa 5 e 1
}


Até tentei fazer, mas na classe das variáveis globais também é necessário inicializá-las via construtor, quando vou instanciar a classe das variáveis globais na ContaDAO também teria que passar parâmetros via construtor, ou seja, caio no mesmo problema.


Será que você pode me mostrar o erro que aparece ao rodar o seu programa?
Responder

26/10/2019

André Freitas

Olá pessoal, estou desenvolvendo um trabalho para a faculdade. Fiz esse código em Kotlin, que comecei agora a programar.
Trata-se de um sistema para gerenciar finanças pessoais. Criei uma classe ContaDAO para fazer a inserção de dados de uma Conta bancária em um BD SQLite. Estou na dúvida de como passo os parâmetros da classe ContaDAO para a classe da activity de cadastro da conta via construtor quando instancio objeto desta classe. No java poderia ter feito as classe ContaDAO sem parâmetros no construtor, mas no Kotlin tive que colocar para inicializar as variáveis. Alguém pode ajudar?


class ContaDAO(database: SQLiteDatabase, dbhelper: SQLiteHelperCta){

    var database = database
    var dbhelper = dbhelper

    fun incluirConta(c: Conta){
        database  = dbhelper.writableDatabase
        val values = ContentValues()
        values.put(SQLiteHelperCta.KEY_NOME_CONTA, c.nome)
        values.put(SQLiteHelperCta.KEY_SALDOINICIAL_CONTA, c.saldoinicial)
        values.put(SQLiteHelperCta.KEY_DESCRICAO_CONTA, c.descricao)

        database.insert(SQLiteHelperCta.TABLE_CONTA, null, values)
        database.close()
    }
}


class ContaCadastro: AppCompatActivity(), View.OnClickListener {

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

        var btnSalvarConta = findViewById<Button>(R.id.btnSalvarConta)
        btnSalvarConta.setOnClickListener(this)
    }

    override fun onClick(v: View?) {
        //val id:Int = SQLiteHelperCta.KEY_ID_CONTA
        var nome = editTextNomeConta.text.toString()
        var saldoinicial = editTextSaldoConta.text.toString()
        var descricao = editTextDescricaoConta.text.toString()

        var c = Conta (nome, saldoinicial, descricao)

        var contadao = ContaDAO(??????, ??????)

        contadao.incluirConta(c)
        finish()
    }
}

Exemplo de instanciação em kotlin com construtor:
class A(num1 : Int, num2 : Int){
var soma : Int
init{
soma = num1 + num2
}
}

fun main(){
val meuObjeto = A(1, 2)
println(meuObjeto.soma)
}
// resultado desse codigo: printa 3 na tela




Meu problema está justamente aí.
Você colocou 1 e 2 como parâmetros da classe A que você criou, algo simples. No meu caso os parâmetros são objetos do tipo SQLitedatabase e SQLiteHelperCta(classe responsável pela criação do banco de dados e tabelas no SQLite)
O mais fácil seria que não houvesse parâmetros, assim como no Java, pois apenas instanciaria a classe ContaDAO e chamaria o método incluirConta(), mas o kotlin me obriga a inicializar as variáveis dentro da classe, o que fiz através do construtor.

Agora, para instanciar a classe ContaDAO eu preciso passar estes dois parâmetros que não sei como fazer. Já tentei Null, mas não aceita.


Espera, não sei se entendi direito seu problema, me explica direito, você precisa de um objeto do tipo sqlitedatabase e sqlitehelpercta disponíveis em duas classes diferentes? se for isso não dá pra simplesmente criar dois objetos desses tipos e deixar eles disponíveis globalmente? Exemplo:

var a = 3 // variável disponível globalmente
var b = 2 // variável disponível globalmente
class A{
    fun imprimir() = println(a + b) // usa as variáveis disponíveis globalmente
}
class B{
    fun imprimir() = println(a - b) // usa as variáveis disponíveis globalmente
}

fun main() {
    val a = A()
    val b = B()
    a.imprimir()
    b.imprimir()
// printa 5 e 1
}


Até tentei fazer, mas na classe das variáveis globais também é necessário inicializá-las via construtor, quando vou instanciar a classe das variáveis globais na ContaDAO também teria que passar parâmetros via construtor, ou seja, caio no mesmo problema.


Será que você pode me mostrar o erro que aparece ao rodar o seu programa?


Ele nem chega a roda. Mostra essa mensagem:

No value passed for parameter 'database'

Na classe ContaCadastro, na linha 19 eu não passei parâmetro no construtor, porque é justamente isso que tô quebrando a cabeça de como colocar. Coloquei ???? no lugar
package br.edu.ifsp.scl.gerfinsdm3.activity

import android.os.Bundle
import android.view.View
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import br.edu.ifsp.scl.gerfinsdm3.R
import br.edu.ifsp.scl.gerfinsdm3.data.ContaDAO
import br.edu.ifsp.scl.gerfinsdm3.model.Conta
import kotlinx.android.synthetic.main.activity_cadconta.*

class ContaCadastro: AppCompatActivity(), View.OnClickListener {

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

        val btnSalvarConta = findViewById<Button>(R.id.btnSalvarConta)
        btnSalvarConta.setOnClickListener(this)
    }

    override fun onClick(v: View?) {
        val nome = editTextNomeConta.text.toString()
        val saldoinicial = editTextSaldoConta.text.toString()
        val descricao = editTextDescricaoConta.text.toString()

        val c = Conta(nome, saldoinicial, descricao)


        val contadao = ContaDAO(??????, ??????)

        contadao.incluirConta(c)
        finish()
    }
}
Responder

27/10/2019

Daniel Melo

Olá pessoal, estou desenvolvendo um trabalho para a faculdade. Fiz esse código em Kotlin, que comecei agora a programar.
Trata-se de um sistema para gerenciar finanças pessoais. Criei uma classe ContaDAO para fazer a inserção de dados de uma Conta bancária em um BD SQLite. Estou na dúvida de como passo os parâmetros da classe ContaDAO para a classe da activity de cadastro da conta via construtor quando instancio objeto desta classe. No java poderia ter feito as classe ContaDAO sem parâmetros no construtor, mas no Kotlin tive que colocar para inicializar as variáveis. Alguém pode ajudar?


class ContaDAO(database: SQLiteDatabase, dbhelper: SQLiteHelperCta){

    var database = database
    var dbhelper = dbhelper

    fun incluirConta(c: Conta){
        database  = dbhelper.writableDatabase
        val values = ContentValues()
        values.put(SQLiteHelperCta.KEY_NOME_CONTA, c.nome)
        values.put(SQLiteHelperCta.KEY_SALDOINICIAL_CONTA, c.saldoinicial)
        values.put(SQLiteHelperCta.KEY_DESCRICAO_CONTA, c.descricao)

        database.insert(SQLiteHelperCta.TABLE_CONTA, null, values)
        database.close()
    }
}


class ContaCadastro: AppCompatActivity(), View.OnClickListener {

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

        var btnSalvarConta = findViewById<Button>(R.id.btnSalvarConta)
        btnSalvarConta.setOnClickListener(this)
    }

    override fun onClick(v: View?) {
        //val id:Int = SQLiteHelperCta.KEY_ID_CONTA
        var nome = editTextNomeConta.text.toString()
        var saldoinicial = editTextSaldoConta.text.toString()
        var descricao = editTextDescricaoConta.text.toString()

        var c = Conta (nome, saldoinicial, descricao)

        var contadao = ContaDAO(??????, ??????)

        contadao.incluirConta(c)
        finish()
    }
}

Exemplo de instanciação em kotlin com construtor:
class A(num1 : Int, num2 : Int){
var soma : Int
init{
soma = num1 + num2
}
}

fun main(){
val meuObjeto = A(1, 2)
println(meuObjeto.soma)
}
// resultado desse codigo: printa 3 na tela




Meu problema está justamente aí.
Você colocou 1 e 2 como parâmetros da classe A que você criou, algo simples. No meu caso os parâmetros são objetos do tipo SQLitedatabase e SQLiteHelperCta(classe responsável pela criação do banco de dados e tabelas no SQLite)
O mais fácil seria que não houvesse parâmetros, assim como no Java, pois apenas instanciaria a classe ContaDAO e chamaria o método incluirConta(), mas o kotlin me obriga a inicializar as variáveis dentro da classe, o que fiz através do construtor.

Agora, para instanciar a classe ContaDAO eu preciso passar estes dois parâmetros que não sei como fazer. Já tentei Null, mas não aceita.


Espera, não sei se entendi direito seu problema, me explica direito, você precisa de um objeto do tipo sqlitedatabase e sqlitehelpercta disponíveis em duas classes diferentes? se for isso não dá pra simplesmente criar dois objetos desses tipos e deixar eles disponíveis globalmente? Exemplo:

var a = 3 // variável disponível globalmente
var b = 2 // variável disponível globalmente
class A{
    fun imprimir() = println(a + b) // usa as variáveis disponíveis globalmente
}
class B{
    fun imprimir() = println(a - b) // usa as variáveis disponíveis globalmente
}

fun main() {
    val a = A()
    val b = B()
    a.imprimir()
    b.imprimir()
// printa 5 e 1
}


Até tentei fazer, mas na classe das variáveis globais também é necessário inicializá-las via construtor, quando vou instanciar a classe das variáveis globais na ContaDAO também teria que passar parâmetros via construtor, ou seja, caio no mesmo problema.


Será que você pode me mostrar o erro que aparece ao rodar o seu programa?


Ele nem chega a roda. Mostra essa mensagem:

No value passed for parameter 'database'

Na classe ContaCadastro, na linha 19 eu não passei parâmetro no construtor, porque é justamente isso que tô quebrando a cabeça de como colocar. Coloquei ???? no lugar
package br.edu.ifsp.scl.gerfinsdm3.activity

import android.os.Bundle
import android.view.View
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import br.edu.ifsp.scl.gerfinsdm3.R
import br.edu.ifsp.scl.gerfinsdm3.data.ContaDAO
import br.edu.ifsp.scl.gerfinsdm3.model.Conta
import kotlinx.android.synthetic.main.activity_cadconta.*

class ContaCadastro: AppCompatActivity(), View.OnClickListener {

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

        val btnSalvarConta = findViewById<Button>(R.id.btnSalvarConta)
        btnSalvarConta.setOnClickListener(this)
    }

    override fun onClick(v: View?) {
        val nome = editTextNomeConta.text.toString()
        val saldoinicial = editTextSaldoConta.text.toString()
        val descricao = editTextDescricaoConta.text.toString()

        val c = Conta(nome, saldoinicial, descricao)


        val contadao = ContaDAO(??????, ??????)

        contadao.incluirConta(c)
        finish()
    }
}


Certo, e o que acontece se dentro do seu override fun onClick(v: View?) você criar um objeto do tipo sqlitehelpercta e outro do tipo sqlitedatabase e passá-los como argumentos para o construtor do contaDAO?
Responder

27/10/2019

André Freitas

Olá pessoal, estou desenvolvendo um trabalho para a faculdade. Fiz esse código em Kotlin, que comecei agora a programar.
Trata-se de um sistema para gerenciar finanças pessoais. Criei uma classe ContaDAO para fazer a inserção de dados de uma Conta bancária em um BD SQLite. Estou na dúvida de como passo os parâmetros da classe ContaDAO para a classe da activity de cadastro da conta via construtor quando instancio objeto desta classe. No java poderia ter feito as classe ContaDAO sem parâmetros no construtor, mas no Kotlin tive que colocar para inicializar as variáveis. Alguém pode ajudar?


class ContaDAO(database: SQLiteDatabase, dbhelper: SQLiteHelperCta){

    var database = database
    var dbhelper = dbhelper

    fun incluirConta(c: Conta){
        database  = dbhelper.writableDatabase
        val values = ContentValues()
        values.put(SQLiteHelperCta.KEY_NOME_CONTA, c.nome)
        values.put(SQLiteHelperCta.KEY_SALDOINICIAL_CONTA, c.saldoinicial)
        values.put(SQLiteHelperCta.KEY_DESCRICAO_CONTA, c.descricao)

        database.insert(SQLiteHelperCta.TABLE_CONTA, null, values)
        database.close()
    }
}


class ContaCadastro: AppCompatActivity(), View.OnClickListener {

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

        var btnSalvarConta = findViewById<Button>(R.id.btnSalvarConta)
        btnSalvarConta.setOnClickListener(this)
    }

    override fun onClick(v: View?) {
        //val id:Int = SQLiteHelperCta.KEY_ID_CONTA
        var nome = editTextNomeConta.text.toString()
        var saldoinicial = editTextSaldoConta.text.toString()
        var descricao = editTextDescricaoConta.text.toString()

        var c = Conta (nome, saldoinicial, descricao)

        var contadao = ContaDAO(??????, ??????)

        contadao.incluirConta(c)
        finish()
    }
}

Exemplo de instanciação em kotlin com construtor:
class A(num1 : Int, num2 : Int){
var soma : Int
init{
soma = num1 + num2
}
}

fun main(){
val meuObjeto = A(1, 2)
println(meuObjeto.soma)
}
// resultado desse codigo: printa 3 na tela




Meu problema está justamente aí.
Você colocou 1 e 2 como parâmetros da classe A que você criou, algo simples. No meu caso os parâmetros são objetos do tipo SQLitedatabase e SQLiteHelperCta(classe responsável pela criação do banco de dados e tabelas no SQLite)
O mais fácil seria que não houvesse parâmetros, assim como no Java, pois apenas instanciaria a classe ContaDAO e chamaria o método incluirConta(), mas o kotlin me obriga a inicializar as variáveis dentro da classe, o que fiz através do construtor.

Agora, para instanciar a classe ContaDAO eu preciso passar estes dois parâmetros que não sei como fazer. Já tentei Null, mas não aceita.


Espera, não sei se entendi direito seu problema, me explica direito, você precisa de um objeto do tipo sqlitedatabase e sqlitehelpercta disponíveis em duas classes diferentes? se for isso não dá pra simplesmente criar dois objetos desses tipos e deixar eles disponíveis globalmente? Exemplo:

var a = 3 // variável disponível globalmente
var b = 2 // variável disponível globalmente
class A{
    fun imprimir() = println(a + b) // usa as variáveis disponíveis globalmente
}
class B{
    fun imprimir() = println(a - b) // usa as variáveis disponíveis globalmente
}

fun main() {
    val a = A()
    val b = B()
    a.imprimir()
    b.imprimir()
// printa 5 e 1
}


Até tentei fazer, mas na classe das variáveis globais também é necessário inicializá-las via construtor, quando vou instanciar a classe das variáveis globais na ContaDAO também teria que passar parâmetros via construtor, ou seja, caio no mesmo problema.


Será que você pode me mostrar o erro que aparece ao rodar o seu programa?


Ele nem chega a roda. Mostra essa mensagem:

No value passed for parameter ''database''

Na classe ContaCadastro, na linha 19 eu não passei parâmetro no construtor, porque é justamente isso que tô quebrando a cabeça de como colocar. Coloquei ???? no lugar
package br.edu.ifsp.scl.gerfinsdm3.activity

import android.os.Bundle
import android.view.View
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import br.edu.ifsp.scl.gerfinsdm3.R
import br.edu.ifsp.scl.gerfinsdm3.data.ContaDAO
import br.edu.ifsp.scl.gerfinsdm3.model.Conta
import kotlinx.android.synthetic.main.activity_cadconta.*

class ContaCadastro: AppCompatActivity(), View.OnClickListener {

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

        val btnSalvarConta = findViewById<Button>(R.id.btnSalvarConta)
        btnSalvarConta.setOnClickListener(this)
    }

    override fun onClick(v: View?) {
        val nome = editTextNomeConta.text.toString()
        val saldoinicial = editTextSaldoConta.text.toString()
        val descricao = editTextDescricaoConta.text.toString()

        val c = Conta(nome, saldoinicial, descricao)


        val contadao = ContaDAO(??????, ??????)

        contadao.incluirConta(c)
        finish()
    }
}


Certo, e o que acontece se dentro do seu override fun onClick(v: View?) você criar um objeto do tipo sqlitehelpercta e outro do tipo sqlitedatabase e passá-los como argumentos para o construtor do contaDAO?


Quando eu coloco como argumento da classe contaDAO não compila, pois diz que as variáveis precisam ser inicializadas.
Responder

27/10/2019

Daniel Melo

Olá pessoal, estou desenvolvendo um trabalho para a faculdade. Fiz esse código em Kotlin, que comecei agora a programar.
Trata-se de um sistema para gerenciar finanças pessoais. Criei uma classe ContaDAO para fazer a inserção de dados de uma Conta bancária em um BD SQLite. Estou na dúvida de como passo os parâmetros da classe ContaDAO para a classe da activity de cadastro da conta via construtor quando instancio objeto desta classe. No java poderia ter feito as classe ContaDAO sem parâmetros no construtor, mas no Kotlin tive que colocar para inicializar as variáveis. Alguém pode ajudar?


class ContaDAO(database: SQLiteDatabase, dbhelper: SQLiteHelperCta){

    var database = database
    var dbhelper = dbhelper

    fun incluirConta(c: Conta){
        database  = dbhelper.writableDatabase
        val values = ContentValues()
        values.put(SQLiteHelperCta.KEY_NOME_CONTA, c.nome)
        values.put(SQLiteHelperCta.KEY_SALDOINICIAL_CONTA, c.saldoinicial)
        values.put(SQLiteHelperCta.KEY_DESCRICAO_CONTA, c.descricao)

        database.insert(SQLiteHelperCta.TABLE_CONTA, null, values)
        database.close()
    }
}


class ContaCadastro: AppCompatActivity(), View.OnClickListener {

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

        var btnSalvarConta = findViewById<Button>(R.id.btnSalvarConta)
        btnSalvarConta.setOnClickListener(this)
    }

    override fun onClick(v: View?) {
        //val id:Int = SQLiteHelperCta.KEY_ID_CONTA
        var nome = editTextNomeConta.text.toString()
        var saldoinicial = editTextSaldoConta.text.toString()
        var descricao = editTextDescricaoConta.text.toString()

        var c = Conta (nome, saldoinicial, descricao)

        var contadao = ContaDAO(??????, ??????)

        contadao.incluirConta(c)
        finish()
    }
}

Exemplo de instanciação em kotlin com construtor:
class A(num1 : Int, num2 : Int){
var soma : Int
init{
soma = num1 + num2
}
}

fun main(){
val meuObjeto = A(1, 2)
println(meuObjeto.soma)
}
// resultado desse codigo: printa 3 na tela




Meu problema está justamente aí.
Você colocou 1 e 2 como parâmetros da classe A que você criou, algo simples. No meu caso os parâmetros são objetos do tipo SQLitedatabase e SQLiteHelperCta(classe responsável pela criação do banco de dados e tabelas no SQLite)
O mais fácil seria que não houvesse parâmetros, assim como no Java, pois apenas instanciaria a classe ContaDAO e chamaria o método incluirConta(), mas o kotlin me obriga a inicializar as variáveis dentro da classe, o que fiz através do construtor.

Agora, para instanciar a classe ContaDAO eu preciso passar estes dois parâmetros que não sei como fazer. Já tentei Null, mas não aceita.


Espera, não sei se entendi direito seu problema, me explica direito, você precisa de um objeto do tipo sqlitedatabase e sqlitehelpercta disponíveis em duas classes diferentes? se for isso não dá pra simplesmente criar dois objetos desses tipos e deixar eles disponíveis globalmente? Exemplo:

var a = 3 // variável disponível globalmente
var b = 2 // variável disponível globalmente
class A{
    fun imprimir() = println(a + b) // usa as variáveis disponíveis globalmente
}
class B{
    fun imprimir() = println(a - b) // usa as variáveis disponíveis globalmente
}

fun main() {
    val a = A()
    val b = B()
    a.imprimir()
    b.imprimir()
// printa 5 e 1
}


Até tentei fazer, mas na classe das variáveis globais também é necessário inicializá-las via construtor, quando vou instanciar a classe das variáveis globais na ContaDAO também teria que passar parâmetros via construtor, ou seja, caio no mesmo problema.


Será que você pode me mostrar o erro que aparece ao rodar o seu programa?


Ele nem chega a roda. Mostra essa mensagem:

No value passed for parameter ''database''

Na classe ContaCadastro, na linha 19 eu não passei parâmetro no construtor, porque é justamente isso que tô quebrando a cabeça de como colocar. Coloquei ???? no lugar
package br.edu.ifsp.scl.gerfinsdm3.activity

import android.os.Bundle
import android.view.View
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import br.edu.ifsp.scl.gerfinsdm3.R
import br.edu.ifsp.scl.gerfinsdm3.data.ContaDAO
import br.edu.ifsp.scl.gerfinsdm3.model.Conta
import kotlinx.android.synthetic.main.activity_cadconta.*

class ContaCadastro: AppCompatActivity(), View.OnClickListener {

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

        val btnSalvarConta = findViewById<Button>(R.id.btnSalvarConta)
        btnSalvarConta.setOnClickListener(this)
    }

    override fun onClick(v: View?) {
        val nome = editTextNomeConta.text.toString()
        val saldoinicial = editTextSaldoConta.text.toString()
        val descricao = editTextDescricaoConta.text.toString()

        val c = Conta(nome, saldoinicial, descricao)


        val contadao = ContaDAO(??????, ??????)

        contadao.incluirConta(c)
        finish()
    }
}


Certo, e o que acontece se dentro do seu override fun onClick(v: View?) você criar um objeto do tipo sqlitehelpercta e outro do tipo sqlitedatabase e passá-los como argumentos para o construtor do contaDAO?


Quando eu coloco como argumento da classe contaDAO não compila, pois diz que as variáveis precisam ser inicializadas.


Seja um pouco mais específico, quais variáveis precisam ser inicializadas e qual o tipo de cada uma?
Responder

27/10/2019

André Freitas

Olá pessoal, estou desenvolvendo um trabalho para a faculdade. Fiz esse código em Kotlin, que comecei agora a programar.
Trata-se de um sistema para gerenciar finanças pessoais. Criei uma classe ContaDAO para fazer a inserção de dados de uma Conta bancária em um BD SQLite. Estou na dúvida de como passo os parâmetros da classe ContaDAO para a classe da activity de cadastro da conta via construtor quando instancio objeto desta classe. No java poderia ter feito as classe ContaDAO sem parâmetros no construtor, mas no Kotlin tive que colocar para inicializar as variáveis. Alguém pode ajudar?


class ContaDAO(database: SQLiteDatabase, dbhelper: SQLiteHelperCta){

    var database = database
    var dbhelper = dbhelper

    fun incluirConta(c: Conta){
        database  = dbhelper.writableDatabase
        val values = ContentValues()
        values.put(SQLiteHelperCta.KEY_NOME_CONTA, c.nome)
        values.put(SQLiteHelperCta.KEY_SALDOINICIAL_CONTA, c.saldoinicial)
        values.put(SQLiteHelperCta.KEY_DESCRICAO_CONTA, c.descricao)

        database.insert(SQLiteHelperCta.TABLE_CONTA, null, values)
        database.close()
    }
}


class ContaCadastro: AppCompatActivity(), View.OnClickListener {

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

        var btnSalvarConta = findViewById<Button>(R.id.btnSalvarConta)
        btnSalvarConta.setOnClickListener(this)
    }

    override fun onClick(v: View?) {
        //val id:Int = SQLiteHelperCta.KEY_ID_CONTA
        var nome = editTextNomeConta.text.toString()
        var saldoinicial = editTextSaldoConta.text.toString()
        var descricao = editTextDescricaoConta.text.toString()

        var c = Conta (nome, saldoinicial, descricao)

        var contadao = ContaDAO(??????, ??????)

        contadao.incluirConta(c)
        finish()
    }
}

Exemplo de instanciação em kotlin com construtor:
class A(num1 : Int, num2 : Int){
var soma : Int
init{
soma = num1 + num2
}
}

fun main(){
val meuObjeto = A(1, 2)
println(meuObjeto.soma)
}
// resultado desse codigo: printa 3 na tela




Meu problema está justamente aí.
Você colocou 1 e 2 como parâmetros da classe A que você criou, algo simples. No meu caso os parâmetros são objetos do tipo SQLitedatabase e SQLiteHelperCta(classe responsável pela criação do banco de dados e tabelas no SQLite)
O mais fácil seria que não houvesse parâmetros, assim como no Java, pois apenas instanciaria a classe ContaDAO e chamaria o método incluirConta(), mas o kotlin me obriga a inicializar as variáveis dentro da classe, o que fiz através do construtor.

Agora, para instanciar a classe ContaDAO eu preciso passar estes dois parâmetros que não sei como fazer. Já tentei Null, mas não aceita.


Espera, não sei se entendi direito seu problema, me explica direito, você precisa de um objeto do tipo sqlitedatabase e sqlitehelpercta disponíveis em duas classes diferentes? se for isso não dá pra simplesmente criar dois objetos desses tipos e deixar eles disponíveis globalmente? Exemplo:

var a = 3 // variável disponível globalmente
var b = 2 // variável disponível globalmente
class A{
    fun imprimir() = println(a + b) // usa as variáveis disponíveis globalmente
}
class B{
    fun imprimir() = println(a - b) // usa as variáveis disponíveis globalmente
}

fun main() {
    val a = A()
    val b = B()
    a.imprimir()
    b.imprimir()
// printa 5 e 1
}


Até tentei fazer, mas na classe das variáveis globais também é necessário inicializá-las via construtor, quando vou instanciar a classe das variáveis globais na ContaDAO também teria que passar parâmetros via construtor, ou seja, caio no mesmo problema.


Será que você pode me mostrar o erro que aparece ao rodar o seu programa?


Ele nem chega a roda. Mostra essa mensagem:

No value passed for parameter ''database''

Na classe ContaCadastro, na linha 19 eu não passei parâmetro no construtor, porque é justamente isso que tô quebrando a cabeça de como colocar. Coloquei ???? no lugar
package br.edu.ifsp.scl.gerfinsdm3.activity

import android.os.Bundle
import android.view.View
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import br.edu.ifsp.scl.gerfinsdm3.R
import br.edu.ifsp.scl.gerfinsdm3.data.ContaDAO
import br.edu.ifsp.scl.gerfinsdm3.model.Conta
import kotlinx.android.synthetic.main.activity_cadconta.*

class ContaCadastro: AppCompatActivity(), View.OnClickListener {

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

        val btnSalvarConta = findViewById<Button>(R.id.btnSalvarConta)
        btnSalvarConta.setOnClickListener(this)
    }

    override fun onClick(v: View?) {
        val nome = editTextNomeConta.text.toString()
        val saldoinicial = editTextSaldoConta.text.toString()
        val descricao = editTextDescricaoConta.text.toString()

        val c = Conta(nome, saldoinicial, descricao)


        val contadao = ContaDAO(??????, ??????)

        contadao.incluirConta(c)
        finish()
    }
}


Certo, e o que acontece se dentro do seu override fun onClick(v: View?) você criar um objeto do tipo sqlitehelpercta e outro do tipo sqlitedatabase e passá-los como argumentos para o construtor do contaDAO?


Quando eu coloco como argumento da classe contaDAO não compila, pois diz que as variáveis precisam ser inicializadas.


Seja um pouco mais específico, quais variáveis precisam ser inicializadas e qual o tipo de cada uma?


Eu fiz como você falou

val db: SQLiteDatabase
val dh: SQLiteOpenHelper


E passei as váriáveis db e dh como argumentos da classe DAO

val contadao = ContaDAO(db, dh)


Dentro dos parênteses o AS indica que as variáveis precisam ser inicializadas. Com null não dá certo.
Responder

27/10/2019

Daniel Melo

Olá pessoal, estou desenvolvendo um trabalho para a faculdade. Fiz esse código em Kotlin, que comecei agora a programar.
Trata-se de um sistema para gerenciar finanças pessoais. Criei uma classe ContaDAO para fazer a inserção de dados de uma Conta bancária em um BD SQLite. Estou na dúvida de como passo os parâmetros da classe ContaDAO para a classe da activity de cadastro da conta via construtor quando instancio objeto desta classe. No java poderia ter feito as classe ContaDAO sem parâmetros no construtor, mas no Kotlin tive que colocar para inicializar as variáveis. Alguém pode ajudar?


class ContaDAO(database: SQLiteDatabase, dbhelper: SQLiteHelperCta){

    var database = database
    var dbhelper = dbhelper

    fun incluirConta(c: Conta){
        database  = dbhelper.writableDatabase
        val values = ContentValues()
        values.put(SQLiteHelperCta.KEY_NOME_CONTA, c.nome)
        values.put(SQLiteHelperCta.KEY_SALDOINICIAL_CONTA, c.saldoinicial)
        values.put(SQLiteHelperCta.KEY_DESCRICAO_CONTA, c.descricao)

        database.insert(SQLiteHelperCta.TABLE_CONTA, null, values)
        database.close()
    }
}


class ContaCadastro: AppCompatActivity(), View.OnClickListener {

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

        var btnSalvarConta = findViewById<Button>(R.id.btnSalvarConta)
        btnSalvarConta.setOnClickListener(this)
    }

    override fun onClick(v: View?) {
        //val id:Int = SQLiteHelperCta.KEY_ID_CONTA
        var nome = editTextNomeConta.text.toString()
        var saldoinicial = editTextSaldoConta.text.toString()
        var descricao = editTextDescricaoConta.text.toString()

        var c = Conta (nome, saldoinicial, descricao)

        var contadao = ContaDAO(??????, ??????)

        contadao.incluirConta(c)
        finish()
    }
}

Exemplo de instanciação em kotlin com construtor:
class A(num1 : Int, num2 : Int){
var soma : Int
init{
soma = num1 + num2
}
}

fun main(){
val meuObjeto = A(1, 2)
println(meuObjeto.soma)
}
// resultado desse codigo: printa 3 na tela




Meu problema está justamente aí.
Você colocou 1 e 2 como parâmetros da classe A que você criou, algo simples. No meu caso os parâmetros são objetos do tipo SQLitedatabase e SQLiteHelperCta(classe responsável pela criação do banco de dados e tabelas no SQLite)
O mais fácil seria que não houvesse parâmetros, assim como no Java, pois apenas instanciaria a classe ContaDAO e chamaria o método incluirConta(), mas o kotlin me obriga a inicializar as variáveis dentro da classe, o que fiz através do construtor.

Agora, para instanciar a classe ContaDAO eu preciso passar estes dois parâmetros que não sei como fazer. Já tentei Null, mas não aceita.


Espera, não sei se entendi direito seu problema, me explica direito, você precisa de um objeto do tipo sqlitedatabase e sqlitehelpercta disponíveis em duas classes diferentes? se for isso não dá pra simplesmente criar dois objetos desses tipos e deixar eles disponíveis globalmente? Exemplo:

var a = 3 // variável disponível globalmente
var b = 2 // variável disponível globalmente
class A{
    fun imprimir() = println(a + b) // usa as variáveis disponíveis globalmente
}
class B{
    fun imprimir() = println(a - b) // usa as variáveis disponíveis globalmente
}

fun main() {
    val a = A()
    val b = B()
    a.imprimir()
    b.imprimir()
// printa 5 e 1
}


Até tentei fazer, mas na classe das variáveis globais também é necessário inicializá-las via construtor, quando vou instanciar a classe das variáveis globais na ContaDAO também teria que passar parâmetros via construtor, ou seja, caio no mesmo problema.


Será que você pode me mostrar o erro que aparece ao rodar o seu programa?


Ele nem chega a roda. Mostra essa mensagem:

No value passed for parameter ''database''

Na classe ContaCadastro, na linha 19 eu não passei parâmetro no construtor, porque é justamente isso que tô quebrando a cabeça de como colocar. Coloquei ???? no lugar
package br.edu.ifsp.scl.gerfinsdm3.activity

import android.os.Bundle
import android.view.View
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import br.edu.ifsp.scl.gerfinsdm3.R
import br.edu.ifsp.scl.gerfinsdm3.data.ContaDAO
import br.edu.ifsp.scl.gerfinsdm3.model.Conta
import kotlinx.android.synthetic.main.activity_cadconta.*

class ContaCadastro: AppCompatActivity(), View.OnClickListener {

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

        val btnSalvarConta = findViewById<Button>(R.id.btnSalvarConta)
        btnSalvarConta.setOnClickListener(this)
    }

    override fun onClick(v: View?) {
        val nome = editTextNomeConta.text.toString()
        val saldoinicial = editTextSaldoConta.text.toString()
        val descricao = editTextDescricaoConta.text.toString()

        val c = Conta(nome, saldoinicial, descricao)


        val contadao = ContaDAO(??????, ??????)

        contadao.incluirConta(c)
        finish()
    }
}


Certo, e o que acontece se dentro do seu override fun onClick(v: View?) você criar um objeto do tipo sqlitehelpercta e outro do tipo sqlitedatabase e passá-los como argumentos para o construtor do contaDAO?


Quando eu coloco como argumento da classe contaDAO não compila, pois diz que as variáveis precisam ser inicializadas.


Seja um pouco mais específico, quais variáveis precisam ser inicializadas e qual o tipo de cada uma?


Eu fiz como você falou

val db: SQLiteDatabase
val dh: SQLiteOpenHelper


E passei as váriáveis db e dh como argumentos da classe DAO

val contadao = ContaDAO(db, dh)


Dentro dos parênteses o AS indica que as variáveis precisam ser inicializadas. Com null não dá certo.


Ah, entendi o erro, você apenas criou as variáveis, mas não inicializou aí, traduzindo o que você fez para java você fez o seguinte:

SqliteDatabase db;
SqliteOpenHelper dh;

ContaDao contadao = new ContaDao(db, dh);


Só criou as variáveis, mas não deu nenhum valor, a declaração de variáveis em kotlin funciona assim:

var minhastring : String //cria uma variável do tipo String, mas não inicializa, se quisermos uma constante ao invés de variável usamos val
var minhastring : String = "oi" //cria uma varável do tipo string e inicializa com o valor oi
var minhastring = "oi" //cria uma variável em estilo "dinâmicamente tipável" e atribui a ela o valor oi


O que eu disse para você fazer foi o seguinte:

override fun onClick(v: View?) {
        val nome = editTextNomeConta.text.toString()
        val saldoinicial = editTextSaldoConta.text.toString()
        val descricao = editTextDescricaoConta.text.toString()
 
        val c = Conta(nome, saldoinicial, descricao)

        val sqlitedatabase = SQLiteDatabase() //É assim que se cria um objeto da classe SQLiteDatabase em kotlin
        val sqlitehelpercta = SQLiteOpenHelper() //É assim que se cria um objeto da classe SQLiteOpenHelper em kotlin 
 
        val contadao = ContaDAO(sqlitedatabase, sqliteopenhelper) // Passei os objetos criados como argumentos
 
        contadao.incluirConta(c)
        finish()
    }


Nota importante, eu não passei os argumentos do construtor no SQLiteOpenHelper, então lembre-se de passar esses argumentos para a sua aplicação de acordo com o que você especificou ai.
Responder

28/10/2019

André Freitas

Não deu certo. Na linha 8 o AS exige que passa um monte de argumentos para a classe SQLitedatabase.
Uma coisa que fiz que resolveu o problema da inicialização das variáveis foi colocar a função incluirConta dentro dentro de SQLitehelperconta, dessa forma no evento de clique do botão da activity de cadastro eu instancio essa classe e chamo a função incluirConta para efetuar o cadastro. Acho que não é a melhor solução, mas foi a que deu certo. Infelizmente, não sei por que, a aplicação ainda não está gravando no BD. E não aprece qualquer erro no LOGCAT
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar