我正在尝试制作一个应用程序,它有一个包含客户的数据库。但主要功能却存在问题:
这是主要文件:
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 来编写这些代码的。我尝试在网上寻找解决方案,但似乎我是唯一遇到该问题的人
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 注入。