在android studio中使用sqlite和kotlin出现问题

问题描述 投票:0回答:1

我正在尝试制作一个应用程序,它有一个包含客户的数据库。但主要功能却存在问题:

这是主要文件:

class AddPatientActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_add_patient)

        val dbPatients = DBHelperPatients(this, null)

        val nameField = findViewById<EditText>(R.id.newPatientName)
        val surnameField = findViewById<EditText>(R.id.newPatientSurName)
        val fathernameField = findViewById<EditText>(R.id.newPatientFatherName)
        val phonenumberField = findViewById<EditText>(R.id.newPatientPhoneNumber)
        val birthdayField = findViewById<EditText>(R.id.newPatientBirthday)

        val btnConfirm = findViewById<Button>(R.id.btnAddPatient)

        btnConfirm.setOnClickListener{
            val name = nameField.text.toString().trim()
            val surname = surnameField.text.toString().trim()
            val fathername = fathernameField.text.toString().trim()
            val phonenumber = phonenumberField.text.toString().trim()
            val birthday = birthdayField.text.toString().trim()

            if(name==""||surname==""||fathername==""||phonenumber==""||birthday==""){
                Toast.makeText(this, "Не все поля заполнены!", Toast.LENGTH_LONG).show()
            }
            val patient = Patient( name, surname, fathername, birthday, phonenumber, 0)
            Log.w("myapp", "${patient.Name}, ${patient.Surname}, ${patient.FatherName}, ${patient.Birthday}, ${patient.PhoneNumber}, ${patient.Amount}")
            dbPatients.writeToDb(patient)

            Log.w("myapp", "${dbPatients.getFromDb(surname)}")

        }

    }
}

数据库类:

class DBHelperPatients(context: Context, factory: SQLiteDatabase.CursorFactory?) :
    SQLiteOpenHelper(context, "dbPatients", factory, 1) {

    override fun onCreate(db: SQLiteDatabase?) {
        val query = ("CREATE TABLE " + "dbPatients" + " ("
                + "id" + " INTEGER PRIMARY KEY, " +
                "name" + " TEXT," +
                "surname" + " TEXT," +
                "fathername" + " TEXT," +
                "birthday" + " TEXT," +
                "phonenumber" + " TEXT," +
                "amount" + " TEXT" + ")")
        db!!.execSQL(query)
    }

    override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
        db!!.execSQL("DROP TABLE IF EXISTS dbPatients")
        onCreate(db)
    }

    fun writeToDb(patient: Patient):Boolean{
        val values = ContentValues()

        values.put("name", patient.Name)
        values.put("surname", patient.Surname)
        values.put("fathername", patient.FatherName)
        values.put("birthday", patient.Birthday)
        values.put("phonenumber", patient.PhoneNumber)
        values.put("amount", patient.Amount)

        val db = this.writableDatabase
        println(values)
        if(db.insert("dbPatients", null, values).toInt() == -1){
            db.close()
            return false
        }
        db.close()
        return true
    }

    @SuppressLint("Recycle")
    fun getFromDb(surname: String):Boolean{
        val db = readableDatabase
        val result = db.rawQuery("SELECT * dbPatients WHERE Surname = '$surname'", null)
        return result.moveToFirst()
    }

}

客户类别(患者)

class Patient(val Name:String, val Surname:String, val FatherName:String, val Birthday:String, val PhoneNumber:String, val Amount:Int) {

}

一切正常,但当它调用函数“writeToDb”时,应用程序崩溃。 我主要是通过 youtube quide 来编写这些代码的。我尝试在网上寻找解决方案,但似乎我是唯一遇到该问题的人

android database kotlin sqlite android-studio
1个回答
0
投票

SELECT 语句应该是

"SELECT * FROM dbPatients WHERE Surname = '$surname'"

即添加了 FROM 关键字。

您可能希望考虑使用方便的

query
方法而不是 rawQuery 方法,这会根据传递的参数构建底层 SQL;例如你可以使用:-

fun getFromDb(surname: String): Boolean {
    val db = readableDatabase
    return db.query("dbPatients",null,"Surname=?", arrayOf(surname),null,null,null).moveToFirst()
}
  • 这也被认为更安全,因为
    ?
    已绑定(即
    ?
    通过 SQLite 调用被值替换),从而防止 SQL 注入。
© www.soinside.com 2019 - 2024. All rights reserved.