如何在 kotlin 的多个活动中使用相同的 SQLiteOpenHelper 对象

How do I work with same SQLiteOpenHelper object in multiple activities in kotlin

我正在为我的大学项目制作一个应用程序,我偶然发现了一个问题。我想使用一个 DatabaseHelper,它继承了我在 activity1 和 activity2 中实例化的 SQLiteOpenHelper 对象。我在网上搜索了一段时间,但没有找到解决方案。我还尝试使用 Serializable 继承 DatabaseHelper 并在开始新的 activity 时将其作为额外的内容放置,但这似乎没有用。使用相同的 DatabaseHelper 对象非常重要,这样我就可以在 activity2 中获得相同的用户,因为在其中我将根据用户身份显示不同的元素,并放置个性化消息。这是我的 DatabaseHelper

的代码

class DatabaseHelper(context: Context):SQLiteOpenHelper(context,dbname,factory, version),Serializable{
    companion object{
        internal val dbname="database"
        internal val factory=null
        internal val version=1
    }

    override fun onCreate(db: SQLiteDatabase?) {
        db?.execSQL("CREATE TABLE users(email VARCHAR(30) PRIMARY KEY,password VARCHAR(10))")
        db?.execSQL("CREATE TABLE machines(name VARCHAR(30) PRIMARY KEY, programmes VARCHAR(10), available CHAR(1))")
        db?.execSQL("CREATE TABLE isUsing(machineID REFERENCES machines(id),userID REFERENCES users(email), PRIMARY KEY (machineID,userID))")
    }

    fun userPresent(email:String,password: String):Boolean{
        val db=writableDatabase
        val query="SELECT * FROM users WHERE email='$email' AND password='$password'"
        val cursor=db.rawQuery(query,null)
        if(cursor.count<=0){
            cursor.close()
            return false
        }
        cursor.close()
        return true
    }

    fun insertMachine(name:String, programmes:String, available:String){
        val db: SQLiteDatabase=writableDatabase
        val values: ContentValues= ContentValues()
        values.put("available",available)
        values.put("name",name)
        values.put("programmes",programmes)
        db.insert("machines",null,values)
        db.close()
    }

    fun insertUserData(email:String,password:String){
        val db: SQLiteDatabase=writableDatabase
        val values: ContentValues= ContentValues()
        values.put("email",email)
        values.put("password",password)
        db.insert("users",null,values)
        db.close()
    }

    override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
        TODO("Not yet implemented")
    }
}

如果我尝试像这样传递 DatabaseHelper 的实例

val intent= Intent(it,AdminMainActivity::class.java)
            var args:Bundle= Bundle()
            args.putSerializable("dbHelper",dbHelper as Serializable)
            startActivity(intent)

并像这样

在新的activity中获取它
var bundle=intent.extras
handler= bundle!!.getSerializable("dbHelper") as DatabaseHelper

我在一行中得到 java.lang.NullPointerException handler= bundle!!.getSerializable("dbHelper") 作为 DatabaseHelper

It is very important that I use the same DatabaseHelper object so I get the same users in activity2

您不需要使用相同的对象实例。重要的是底层数据库数据,它对于助手的所有实例都是相同的 class.

所以,试图传递一个对象并不是真正需要解决的问题。更好的方法是在任何需要的地方实例化 DatabaseHelper