Котлин тост в неактивном классе - PullRequest
0 голосов
/ 02 октября 2018

Нам не нравится тост, но мы включили его в наш класс DBHelper, чтобы знать, была ли создана БДДА Logcat указал на тост и другие связанные мероприятияПервая ошибка, не комментирующая тост

        btnSaveItemData.setOnClickListener {
        if (etItemData.text.toString().equals("")) {
            message("ENTER Item")
            etItemData.requestFocus()
            return@setOnClickListener
        }

        if (etItemFK.text.toString().equals("") || etItemFK.text.toString().toInt() == 0) {
            message("ENTER foreign key")
            etItemFK.requestFocus()
            return@setOnClickListener
        }

        val dbManager = DBHelper(this)
        val values = ContentValues()
        values.put("item", etItemData.text.toString())
        values.put("fkI",Integer.parseInt(etItemFK.text.toString()))
        if (idI == 0) {
            val mID = dbManager.insertITEM(values)

            if (mID > 0) {
                tvMsg.setTextColor(Color.RED)
                message("ADDED Item successfully")
                //Timer().schedule(800){
                    nextACTIVITY()
                //}
            } else {
                message("Failed to add Item")
            }
        }
    }

А вот полный DBHelper с TOAST

class DBHelper(context: Context): SQLiteOpenHelper(context,DBHelper.DB_NAME,null,DBHelper.DB_VERSION) {

override fun onCreate(db: SQLiteDatabase?) {

    val CREATE_TABLE_DEPT = "CREATE TABLE ${PARENT_TABLE} ($colidD INTEGER PRIMARY KEY,$colDept TEXT,$colPFK INTEGER);"
    val CREATE_TABLE_ITEM = "CREATE TABLE ${CHILD_TABLE} ($colidI INTEGER PRIMARY KEY,$colItem TEXT,$colCFK INTEGER);"
    db!!.execSQL(CREATE_TABLE_DEPT)
    db.execSQL(CREATE_TABLE_ITEM)

    Toast.makeText(this.context,"database is created",Toast.LENGTH_LONG).show()
}

override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
    val DROP_TABLE_DEPT = "DROP TABLE IF EXISTS $PARENT_TABLE"
    val DROP_TABLE_ITEM = "DROP TABLE IF EXISTS $CHILD_TABLE"
    db!!.execSQL(DROP_TABLE_DEPT)
    db.execSQL(DROP_TABLE_ITEM)
    onCreate(db)
}

fun queryDEPT(): List<ModelParent> {
    val db = this.writableDatabase
    val parentList = ArrayList<ModelParent>()
    val selectQuery = "SELECT  * FROM ${PARENT_TABLE}"
    val cursor = db.rawQuery(selectQuery, null)
    if (cursor != null) {
        if (cursor.moveToFirst()) {
            do {
                val contact = ModelParent()
                contact.idD = Integer.parseInt(cursor.getString(cursor.getColumnIndex(colidD)))
                contact.dept = cursor.getString(cursor.getColumnIndex(colDept))
                contact.fkD = Integer.parseInt(cursor.getString(cursor.getColumnIndex(colPFK)))
                parentList.add(contact)
            } while (cursor.moveToNext())
        }
    }
    cursor.close()
    return parentList
}

fun queryITEM(): List<ModelChild> {
    val db = this.writableDatabase
    val childList = ArrayList<ModelChild>()
    val selectQuery = "SELECT  * FROM ${CHILD_TABLE}"
    val cursor = db.rawQuery(selectQuery, null)
    if (cursor != null) {
        if (cursor.moveToFirst()) {
            do {
                val contact = ModelChild()
                contact.idI = Integer.parseInt(cursor.getString(cursor.getColumnIndex(colidI)))
                contact.item = cursor.getString(cursor.getColumnIndex(colItem))
                contact.fkI = Integer.parseInt(cursor.getString(cursor.getColumnIndex(colCFK)))
                childList.add(contact)
            } while (cursor.moveToNext())
        }
    }
    cursor.close()
    return childList
}

fun insertDEPT(values: ContentValues): Long {
    val db = this.writableDatabase
    val idD = db.insert(PARENT_TABLE, null, values)
    return idD
}

fun updateDEPT(values: ContentValues, selection: String, selectionargs: Array<String>):Int{
    val db = this.writableDatabase
    val dept = db.update(PARENT_TABLE,values,selection,selectionargs)
    return dept
}

fun insertITEM(values: ContentValues): Long {
    val db = this.writableDatabase
    val idI = db.insert(CHILD_TABLE, null, values)
    return idI
}

fun updateITEM(values: ContentValues, selection: String, selectionargs: Array<String>): Int {
    val db = this.writableDatabase
    val count = db.update(CHILD_TABLE, values, selection, selectionargs)
    return count
}

fun deleteDEPT(productname: String): Boolean {
    var result = false
    val query = "SELECT * FROM $PARENT_TABLE WHERE $colDept= \"$productname\""
    val db = this.writableDatabase
    val cursor = db.rawQuery(query, null)

    if (cursor.moveToFirst()) {
        val id = Integer.parseInt(cursor.getString(0))
        db.delete(PARENT_TABLE, "$colidD = ?", arrayOf(id.toString()))
        cursor.close()
        result = true
    }
    db.close()
    return result
}

fun deleteITEM(productname: String): Boolean {
    var result = false
    val query = "SELECT * FROM $CHILD_TABLE WHERE $colItem= \"$productname\""
    val db = this.writableDatabase
    val cursor = db.rawQuery(query, null)

    if (cursor.moveToFirst()) {
        val id = Integer.parseInt(cursor.getString(0))
        db.delete(CHILD_TABLE, "$colidI = ?", arrayOf(id.toString()))
        cursor.close()
        result = true
    }
    db.close()
    return result
}

var context: Context? = null

companion object {
    private val DB_VERSION = 1
    private val DB_NAME = "Kids.db"
    private val PARENT_TABLE = "Parent"
    private val colidD = "idD"
    private val colDept = "Dept"
    private val colPFK = "fkD"
    private val CHILD_TABLE = "Child"
    private val colidI = "idI"
    private val colItem = "Item"
    private val colCFK = "fkI"
}

}

После того, как DBHelper записывает данные в базу данных, nextActivity обращается кDBHelper для queryDEPT и будет отображать данные с ViewParentActivity

class ViewParentActivity : AppCompatActivity() {

private var RecyclerAdapter: ParentAdapter? = null
private var recyclerView: RecyclerView? = null
private val db = DBHelper(this)
private var parentList:List<ModelParent> = ArrayList()
private var linearLayoutManager: LinearLayoutManager? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_view_parent)
    supportActionBar?.setDisplayHomeAsUpEnabled(true)

    initViews()

}// end onCreate


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

// This is ONLY called when Activity is in onResume state
private fun initDB() {
    parentList = db.queryDEPT()
    if(parentList.isEmpty()){
        title = "No Records in DB"
    }else{
        title = "Parent List"
    }

    RecyclerAdapter = ParentAdapter(parentList = parentList, context = applicationContext)
    (recyclerView as RecyclerView).adapter = RecyclerAdapter
}

private fun initViews() {

    recyclerView = this.findViewById(R.id.rvParentView)
    // val etDeptFK can not be reasigned ?
    //etDeptFK = this.findViewById(R.id.etDeptFK)
    RecyclerAdapter = ParentAdapter(parentList = parentList, context = applicationContext)
    linearLayoutManager = LinearLayoutManager(applicationContext)
    (recyclerView as RecyclerView).layoutManager = linearLayoutManager!!
}

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.menu_main, menu)
    return super.onCreateOptionsMenu(menu)
}

override fun onOptionsItemSelected(item: MenuItem?): Boolean {
    if (item != null) {
        when (item.itemId) {
            R.id.addNote -> {
                val intent = Intent(this, EnterParentActivity::class.java)
                intent.putExtra("FROM","N")// ADD NEW NOTE
                startActivity(intent)
            }
        }
        // CODE below manages HOME Button
        val id = item.itemId
        if (id == android.R.id.home) {
            val intent = Intent(this, EnterParentActivity::class.java)
            intent.putExtra("FROM","N")// ADD NEW NOTE
            startActivity(intent)
        }
    }
    return super.onOptionsItemSelected(item)
}

Потому что нам сейчас любопытноВопрос в том, как разместить тост или какую-либо другую форму уведомления в не классе деятельности?

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Я подозреваю, что this.context может быть виновником.Вы не можете получить доступ к контексту SQLiteOpenHelper таким образом.Вы можете использовать следующий код:

//declare the context as private val property in the constructor see https://kotlinlang.org/docs/reference/classes.html
class DBHelper(private val context: Context):SQLiteOpenHelper(context,DBHelper.DB_NAME,null,DBHelper.DB_VERSION) {

    override fun onCreate(db: SQLiteDatabase?) {

    val CREATE_TABLE_DEPT = "CREATE TABLE ${DEPT_TABLE} ($colidD INTEGER PRIMARY KEY, $colDept TEXT);"
    val CREATE_TABLE_ITEM = "CREATE TABLE ${ITEM_TABLE} ($colidI INTEGER PRIMARY KEY, $colItem TEXT);"
    db!!.execSQL(CREATE_TABLE_DEPT)
    db.execSQL(CREATE_TABLE_ITEM)

    //use the context from the constructor
    Toast.makeText(context, " database is created", Toast.LENGTH_LONG).show()
}

Создает новую ссылку на context с помощью кодового слова val в конструкторе, который, в свою очередь, используется для Toast

0 голосов
/ 02 октября 2018

Вот почему они изобрели внутренний класс, этот код показывает старый мерзкий тост

inner class DatabaseHelper : SQLiteOpenHelper {

    var context: Context? = null

    constructor(context: Context) : super(context, dbName, null, dbVersion) {
        this.context = context
    }

    override fun onCreate(db: SQLiteDatabase?) {
        db!!.execSQL(CREATE_TABLE_SQL)
        Toast.makeText(this.context, " database is created", Toast.LENGTH_LONG).show()
    }

    override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
        db!!.execSQL("Drop table IF EXISTS " + dbTable)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...