我最近开始学习 kotlin,我正在尝试使用 SQLite 实现一个数据库。当我尝试使用这些功能时,应用程序崩溃了。我不知道如何找到错误日志,所以我添加了我制作的功能以及这些功能的实现位置。谢谢您的帮助。
package com.example.mrtayyab.sqlitedbkotlin
import android.content.ClipDescription
import android.content.ContentValues
import android.content.Context
import android.database.Cursor
import android.database.DatabaseUtils
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
class DatabaseHelper(context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, 1) {
companion object {
val DATABASE_NAME = "passwords.db"
val TABLE_NAME = "passwords_table"
val COL_1 = "ID"
val COL_2 = "DESCRIPTION"
val COL_3 = "PASSWORD"
val COL_4 = "DATE_TIME"
}
override fun onCreate(db: SQLiteDatabase) {
db.execSQL("CREATE TABLE IF NOT EXISTS $TABLE_NAME(ID INTEGER PRIMARY KEY AUTOINCREMENT , DESCRIPTION TEXT , PASSWORD TEXT , DATE_TIME INTEGER)")
}
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
db.execSQL("DROP TABLE IF EXISTS $TABLE_NAME")
onCreate(db)
}
fun insertData(description: String, password: String, date_time: String): Boolean? {
val db = this.writableDatabase
val cv = ContentValues()
cv.put(COL_2, description)
cv.put(COL_3, password)
cv.put(COL_4, date_time)
val res = db.insert(TABLE_NAME, null, cv)
return !res.equals(-1)
}
fun getData(id: String, COL_NUM: String): Cursor {
val column = arrayOf("$COL_NUM")
val columnValue = arrayOf("$id")
val db = this.writableDatabase
return db.query("$TABLE_NAME", column, "$COL_1", columnValue, null, null, null )
}
fun getTableCount(): Long {
val db = this.readableDatabase
val count = DatabaseUtils.queryNumEntries(db, TABLE_NAME)
return count
}
}
这是实现它的代码
package com.example.juliaojonah_hci_outcome2_v1
import android.content.Context
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.LinearLayout
import android.widget.ScrollView
import android.widget.TextView
import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.mrtayyab.sqlitedbkotlin.DatabaseHelper
import com.google.gson.Gson
import kotlinx.android.synthetic.main.activity_main.*
import java.text.DateFormat
import java.util.*
import kotlin.collections.ArrayList
class passwords : AppCompatActivity() {
lateinit var myDb: DatabaseHelper
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_passwords)
val dateTime = Calendar.getInstance().time
val dateFormatted = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format(dateTime)
val dateTextView : TextView = findViewById(R.id.textDate2) as TextView
dateTextView.setText(dateFormatted)
val recyclerView = findViewById(R.id.savedPasswords) as RecyclerView
recyclerView.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, false)
val counter = myDb.getTableCount()
val passwords = ArrayList<PasswordCluster>()
if (counter > 0) {
for (i in 1..counter) {
var id = i
var description = myDb.getData(id.toString(), "COL_2")
var password = myDb.getData(id.toString(), "COL_3")
var dateTime = myDb.getData(id.toString(), "COL_4")
passwords.add(PasswordCluster(description.toString(), password.toString(), dateTime.toString()))
}
}
/*
passwords.add(PasswordCluster("Amazon", "56,78,90,12", "Friday"))
passwords.add(PasswordCluster("Amazon", "56,78,90,12", "Friday"))
passwords.add(PasswordCluster("Amazon", "56,78,90,12", "Friday"))
passwords.add(PasswordCluster("Amazon", "56,78,90,12", "Friday"))
passwords.add(PasswordCluster("Amazon", "56,78,90,12", "Friday"))
*/
val adapter = CustomAdapter(passwords)
recyclerView.adapter = adapter
}
fun firstActivity(view: View){
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
}
}
我在最后一段代码中使用了保存数据功能,它没有崩溃,但我不知道它是否工作正常
package com.example.juliaojonah_hci_outcome2_v1
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.text.TextUtils
import android.view.View
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.example.mrtayyab.sqlitedbkotlin.DatabaseHelper
import com.google.gson.Gson
import kotlinx.android.synthetic.main.activity_main.*
import java.security.spec.PSSParameterSpec
import java.text.DateFormat
import java.util.*
import kotlin.random.Random
class MainActivity : AppCompatActivity() {
lateinit var myDb: DatabaseHelper
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val dateTime = Calendar.getInstance().time
val dateFormatted = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format(dateTime)
val dateTextView : TextView = findViewById(R.id.textDate) as TextView
dateTextView.setText(dateFormatted)
myDb = DatabaseHelper(this)
}
fun secondActivity(view: View){
val intent = Intent(this, passwords::class.java)
startActivity(intent)
}
fun randomise(view: View){
val passwordSet1 = Random.nextInt(0,99)
val passwordSet2 = Random.nextInt(0,99)
val passwordSet3 = Random.nextInt(0,99)
val passwordSet4 = Random.nextInt(0,99)
val editText1 = findViewById<EditText>(R.id.password1)
editText1.setText(passwordSet1.toString())
val editText2 = findViewById<EditText>(R.id.password2)
editText2.setText(passwordSet2.toString())
val editText3 = findViewById<EditText>(R.id.password3)
editText3.setText(passwordSet3.toString())
val editText4 = findViewById<EditText>(R.id.password4)
editText4.setText(passwordSet4.toString())
}
fun save(view: View){
var correct = true
val description = descriptionName.text.toString().trim()
val password = password1.text.toString().trim() + "-" + password2.text.toString().trim() + "-" + password3.text.toString().trim() + "-" + password4.text.toString().trim()
val dateTime = Calendar.getInstance().time
val dateFormatted = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format(dateTime)
if (TextUtils.isEmpty(description)){
descriptionName.error = "Enter description"
correct = false
}
if (password == "---"){
password1.error = "Enter password"
password2.error = "Enter password"
password3.error = "Enter password"
password4.error = "Enter password"
correct = false
}
var isInserted = myDb.insertData(description, password, dateFormatted)
if (isInserted == true && correct == true){
Toast.makeText(this, "Data Saved", Toast.LENGTH_LONG).show()
Toast.makeText(this, isInserted.toString(), Toast.LENGTH_LONG).show()
} else {
Toast.makeText(this, "Data Not Saved", Toast.LENGTH_LONG).show()
}
}
}
这是我尝试启动密码活动时首先出现的错误
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.juliaojonah_hci_outcome2_v1, PID: 20054
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.juliaojonah_hci_outcome2_v1/com.example.juliaojonah_hci_outcome2_v1.passwords}: kotlin.UninitializedPropertyAccessException: lateinit property myDb has not been initialized
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
Caused by: kotlin.UninitializedPropertyAccessException: lateinit property myDb has not been initialized
at com.example.juliaojonah_hci_outcome2_v1.passwords.onCreate(passwords.kt:42)
at android.app.Activity.performCreate(Activity.java:6662)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
这就是我尝试运行 .getData 函数时发生的情况
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.juliaojonah_hci_outcome2_v1, PID: 20221
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.juliaojonah_hci_outcome2_v1/com.example.juliaojonah_hci_outcome2_v1.passwords}: kotlin.UninitializedPropertyAccessException: lateinit property myDb has not been initialized
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
Caused by: kotlin.UninitializedPropertyAccessException: lateinit property myDb has not been initialized
at com.example.juliaojonah_hci_outcome2_v1.passwords.onCreate(passwords.kt:51)
at android.app.Activity.performCreate(Activity.java:6662)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)