【问题标题】:How to use SQLite in android fragments?如何在 android 片段中使用 SQLite?
【发布时间】:2019-07-10 15:03:00
【问题描述】:

我是一个有抱负的安卓开发者。我想用 SQLtite 支持做一个简单的项目,但我遇到了 SQLite 带有 Fragment 的问题。

提前感谢您的帮助

我尝试将context: FragmentTwo 替换为context: MainActivity

原来是另一个错误。

基于此,我得出结论,这不是解决问题的办法。????????????

class sql(context: FragmentTwo):SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VER) {
    companion object{
        private val DATABASE_VER=1
        private val DATABASE_NAME="GUESTS.db"

        private val TABLE_NAME= "GUESTS"
        private val COL_ID= "Id"
        private val COL_NAME= "Name"
        private val COL_CITY= "City"

    }
    override fun onCreate(db: SQLiteDatabase?) {
        val CREATE_TABLE_QUERY = ("CREATE TABLE $TABLE_NAME +($COL_ID INTEGER PRIMARY KEY,$COL_NAME TEXT, $COL_CITY TEXT)")
        db!!.execSQL(CREATE_TABLE_QUERY)

    }

    override fun onUpgrade(db: SQLiteDatabase?, p1: Int, p2: Int) {
        db!!.execSQL("DROP TABLE IF EXISTS $TABLE_NAME")
        onCreate(db!!)
    }
    val allguest:List<guest>
    get(){
        val listguest = ArrayList<guest>()
        val selectQuery = "SELECT * FROM $TABLE_NAME"
        val db = this.writableDatabase
        val cursor = db.rawQuery(selectQuery, null)
        if (cursor.moveToFirst()){
            do {
                val guest= guest()
                guest.id=cursor.getInt(cursor.getColumnIndex(COL_ID))
                guest.name=cursor.getString(cursor.getColumnIndex(COL_NAME))
                guest.city=cursor.getString(cursor.getColumnIndex(COL_CITY))

                listguest.add(guest)

            }
                while (cursor.moveToNext())
        }
        db.close()
        return listguest
    }
    fun addGuest(guest: guest){

        val db = this.writableDatabase
        val values = ContentValues()
        values.put(COL_ID, guest.id)
        values.put(COL_NAME, guest.name)
        values.put(COL_CITY, guest.city)

        db.insert(TABLE_NAME, null, values)
        db.close()
    }

    fun updateGuest(guest: guest):Int{

        val db = this.writableDatabase
        val values = ContentValues()
        values.put(COL_ID, guest.id)
        values.put(COL_NAME, guest.name)
        values.put(COL_CITY, guest.city)

        return db.update(TABLE_NAME, values, "$COL_ID=?", arrayOf(guest.id.toString()))

    }

    fun deleteGuest(guest: guest){

        val db = this.writableDatabase



        db.delete(TABLE_NAME, "$COL_ID=?", arrayOf(guest.id.toString()))
        db.close()

    }
}

以下函数都不能使用提供的参数调用:

public constructor SQLiteOpenHelper(@RecentlyNullable p0: Context!, @RecentlyNullable p1: String!, @RecentlyNullable p2: ((SQLiteDatabase!, SQLiteCursorDriver!, String!, SQLiteQuery!) -> Cursor!)!, p3: Int) defined in android.database.sqlite.SQLiteOpenHelper
public constructor SQLiteOpenHelper(@RecentlyNullable p0: Context!, @RecentlyNullable p1: String!, @RecentlyNullable p2: SQLiteDatabase.CursorFactory!, p3: Int) defined in android.database.sqlite.SQLiteOpenHelper
public constructor SQLiteOpenHelper(@RecentlyNullable p0: Context!, @RecentlyNullable p1: String!, p2: Int, @RecentlyNonNull p3: SQLiteDatabase.OpenParams!) defined in android.database.sqlite.SQLiteOpenHelper

【问题讨论】:

标签: android android-fragments kotlin android-sqlite


【解决方案1】:

SQLiteOpenHelper 构造函数的第一个参数是ContextFragment 不是 Context

战术上,替换:

class sql(context: FragmentTwo):SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VER) {

与:

class sql(fragment: FragmentTwo):SQLiteOpenHelper(fragment.requireContext(), DATABASE_NAME, null, DATABASE_VER) {

但是,在现代 Android 应用开发中,片段不应直接与 SQLiteOpenHelper 一起使用。至少,片段应该与ViewModel 一起使用,而后者又与单例SQLiteOpenHelper 一起使用。确保您用于学习 Android 应用程序开发的任何书籍或课程都向您展示了如何使用 Jetpack/AndroidX 库,包括 ViewModelLiveData

【讨论】:

    猜你喜欢
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    相关资源
    最近更新 更多