如何在 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
。
我正在为我的大学项目制作一个应用程序,我偶然发现了一个问题。我想使用一个 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
。