在kotlin中搜索sqlite数据库的问题
Problem searching sqlite database in kotlin
首先,我是 Kotlin 的小白,尝试在家学习,开始为我工作的公司制作程序。
制作的SQLite数据库由4个table组成,其中一个"Empeloyees"有公司员工的数据,包括部门和专业。
第二个 table 记录这些员工的假期。
这是我的主要Activity代码:
class DBHelper(context: Context) :
SQLiteOpenHelper(context, DB_Name, null, 1) {
override fun onCreate(db: SQLiteDatabase) {
db.execSQL("CREATE TABLE IF NOT EXISTS Empeloyees (EmpID INTEGER PRIMARY KEY, EmpName TEXT NOT NULL, EmpProfession TEXT NOT NULL, EmpDepartment TEXT NOT NULL, EmpPhone TEXT NOT NULL, EmpDayofbirth TEXT, EmpMonthofbirth TEXT, EmpYearofbirth TEXT, EmpDayofhire TEXT, EmpMonthofhire TEXT, EmpYearofhire TEXT)")
db.execSQL("CREATE TABLE IF NOT EXISTS Wardeya (WarID INTEGER PRIMARY KEY AUTOINCREMENT, WarName TEXT NOT NULL)")
db.execSQL("CREATE TABLE IF NOT EXISTS Permessions (PermID INTEGER PRIMARY KEY, EmpName TEXT NOT NULL, Engineer TEXT NOT NULL, Wardeya TEXT NOT NULL, PermDay TEXT NOT NULL, PermMonth TEXT NOT NULL, PermYear TEXT NOT NULL)")
db.execSQL("CREATE TABLE IF NOT EXISTS Holidays (HolidayID INTEGER PRIMARY KEY, Department TEXT NOT NULL, Profession TEXT NOT NULL, EmpName TEXT NOT NULL, DaysofHoliday TEXT NOT NULL, StartDay TEXT NOT NULL, StartMonth TEXT NOT NULL, StartYear TEXT NOT NULL, EndDay TEXT NOT NULL, EndMonth TEXT NOT NULL, EndYear TEXT NOT NULL, PresentedDay TEXT NOT NULL, PresentedMonth TEXT NOT NULL, PresentedYear TEXT NOT NULL, Engineer TEXT NOT NULL, ApproveDay TEXT NOT NULL, ApproveMonth TEXT NOT NULL, ApproveYear TEXT NOT NULL)")
}
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
db.execSQL("DROP TABLE IF EXISTS Empeloyees")
db.execSQL("DROP TABLE IF EXISTS Wardeya")
db.execSQL("DROP TABLE IF EXISTS Permessions")
db.execSQL("DROP TABLE IF EXISTS Holidays")
onCreate(db)
}
fun insertDataEmp(id: Int, name: String, prof: String, department: String, phone: String, dayofbirth: String, monthofbirth: String, yearofbirth: String, dayofhire: String, monthofhire: String, yearofhire: String) {
val db = this.writableDatabase
val contentValues = ContentValues()
contentValues.put(COL_11, id)
contentValues.put(COL_12, name)
contentValues.put(COL_13, prof)
contentValues.put(COL_14, department)
contentValues.put(COL_15, phone)
contentValues.put(COL_16, dayofbirth)
contentValues.put(COL_17, monthofbirth)
contentValues.put(COL_18, yearofbirth)
contentValues.put(COL_19, dayofhire)
contentValues.put(COL_110, monthofhire)
contentValues.put(COL_111, yearofhire)
db.insert(TABLE_EMP, null, contentValues)
}
val allDataEmp : Cursor
get() {
val db = this.writableDatabase
val res = db.rawQuery("SELECT * FROM " + TABLE_EMP, null)
return res
}
那些用于构建数据库的 r 和 tables.
我还有一个 activity 可以制作接口来插入假期数据,比如谁要求休假,他在哪个部门工作,他的职业是什么。所以我开始activity有2个snippers,第一个是在Empolyees table中搜索Departments,第二个是按departments搜索professions:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_holidays_page)
val s1 = spin1
s1.onItemSelectedListener = object : OnItemSelectedListener {
override fun onNothingSelected(parent1: AdapterView<*>?) {
}
override fun onItemSelected(parent1: AdapterView<*>?, view: View?, position: Int, id: Long) {
DepartmentTextView.text = "${parent1?.selectedItem.toString()}"
}
}
val DepartmentList = ArrayList<String>()
val ProfessionList = ArrayList<String>()
val db = dbHelper.readableDatabase
val st1 = "SELECT DISTINCT EmpProfession FROM Empeloyees where EmpDepartment=\'"+DepartmentTextView.text.toString()+"\'"
val c1 = db.rawQuery("SELECT DISTINCT EmpDepartment FROM Empeloyees", null)
val c2 = db.rawQuery(st1, null)
if (c1.moveToFirst()) {
do {
DepartmentList.add(c1.getString(c1.getColumnIndex("EmpDepartment")))
}
while (c1.moveToNext())
val mySpinner1 = findViewById(R.id.spin1) as Spinner
var adapter= ArrayAdapter(this,android.R.layout.simple_list_item_1,DepartmentList)
mySpinner1.adapter = adapter
}
if (c2.moveToFirst()) {
do {
ProfessionList.add(c2.getString(c2.getColumnIndex("EmpProfession")))
}
while (c2.moveToNext())
val mySpinner2 = findViewById(R.id.spin2) as Spinner
var adapter1 = ArrayAdapter(this, android.R.layout.simple_list_item_1, ProfessionList)
mySpinner2.adapter = adapter1
}
}
Employees table 中的第一个部门,并将它们放入数组列表 n 中,将其绑定到 snipper1 适配器。
我的主要问题是第二次搜索的光标,我尝试了所有可能的解决方案(“=运算符”、"LIKE Operator"、"MATCH Operator"),但没有在table中搜索。但是当我将光标 sql 字符串更改为 "SELECT DISTINCT EmpProfession FROM Empeloyees" 时,我得到了 snipper2 适配器。
所以知道问题出在哪里吗???
我认为您的问题是从 spinner1 中进行的选择不会导致 spinner2 发生变化。如果微调器 2 由微调器 1 驱动,那么您的效率也很低,那么您每次都需要构建一个新的适配器。
也许考虑以下示例,该示例将单个函数合并到 return 适当的 ArrayList 即 getArrayList 和管理适配器单个实例的函数即 manageSpinner1 和 manageSpinner2 注意到 spinner1 的 onItemSelected 调用 manageSpinner2.
该示例还通过addSomeData函数加载了一些测试数据(此函数仅在没有数据时添加数据)。
注意 为方便起见,使用的布局是 activity_main.xml(您只需使用您的布局)。
activity MainActivity.kt 是(请注意,您的大部分原始代码已被注释掉):-
class MainActivity : AppCompatActivity() {
lateinit var selected :String
var adapter1 :ArrayAdapter<String>? = null
var adapter2 :ArrayAdapter<String>? = null
var DepartmentList = ArrayList<String>()
var ProfessionList = ArrayList<String>()
var mySpinner1 :Spinner? = null
var mySpinner2 :Spinner? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val dbHelper = DBHelper(this)
addSomeData(dbHelper)
selected = ""
val s1 = spin1
mySpinner1 = spin1
mySpinner2 = spin2
manageSpinner1(dbHelper)
}
private fun addSomeData(dbhlepr :DBHelper) {
val db = dbhlepr.writableDatabase
if (DatabaseUtils.queryNumEntries(db,DBHelper.TABLE_EMP) > 0) return
dbhlepr.insertDataEmp(1,"Mary","Nurse","Dept1","phone1","14","03","1998","01","01","2005")
dbhlepr.insertDataEmp(2,"John","Attendant","Dept6","phone1","14","03","1998","01","01","2005")
dbhlepr.insertDataEmp(3,"Susan","Doctor","Dept15","phone1","14","03","1998","01","01","2005")
dbhlepr.insertDataEmp(4,"Geoff","Surgeon","Dept25","phone1","14","03","1998","01","01","2005")
}
private fun manageSpinner1(dbHelper: DBHelper) {
DepartmentList.clear()
DepartmentList.addAll(getArrayList(dbHelper, TYPE_DEPT))
if (adapter1 == null) {
adapter1 = ArrayAdapter(this,android.R.layout.simple_list_item_1,DepartmentList)
spin1.adapter = adapter1
spin1.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onNothingSelected(parent1: AdapterView<*>?) {}
override fun onItemSelected(parent1: AdapterView<*>?, view: View?, position: Int, id: Long) {
selected = "${parent1?.selectedItem.toString()}"
manageSpinner2(dbHelper)
}
}
} else {
adapter1!!.notifyDataSetChanged()
}
}
private fun manageSpinner2(dbHelper: DBHelper) {
Log.d("SPINNER2","Managing Spinner 2 selected department is " + selected)
ProfessionList.clear()
ProfessionList.addAll(getArrayList(dbHelper, TYPE_PROF))
if (adapter2 == null) {
adapter2 = ArrayAdapter(this,android.R.layout.simple_list_item_1,ProfessionList)
spin2.adapter = adapter2
spin2.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onNothingSelected(parent1: AdapterView<*>?) {}
override fun onItemSelected(parent1: AdapterView<*>?, view: View?, position: Int, id: Long) {
}
}
} else {
adapter2!!.notifyDataSetChanged()
}
}
private fun getArrayList(dbHelper: DBHelper, type: Int) :ArrayList<String> {
var rv = ArrayList<String>()
var query = ""
val db = dbHelper.writableDatabase
if (type == TYPE_DEPT) {
query =" SELECT " + DBHelper.COL_14 + " FROM " + DBHelper.TABLE_EMP + " GROUP BY " + DBHelper.COL_14
} else {
query = "SELECT " + DBHelper.COL_13 + " FROM " + DBHelper.TABLE_EMP +
" WHERE " + DBHelper.COL_14 + "='" + selected + "'"
" GROUP BY " + DBHelper.COL_13
}
Log.d("GETARRAYLIST","Query is \n\t" + query)
val c = db.rawQuery(query,null)
while (c.moveToNext()) {
rv.add(c.getString(0))
}
c.close()
return rv
}
companion object {
const val TYPE_DEPT = 1
const val TYPE_PROF = 2
}
}
结果
当第一次 运行 :-
微调器 1 已展开:-
部门15已选择(专业博士):-
等等。
请注意,Spinner2 可能只是一个 TextView,因为所选部门只会有 1 个专业。
首先,我是 Kotlin 的小白,尝试在家学习,开始为我工作的公司制作程序。 制作的SQLite数据库由4个table组成,其中一个"Empeloyees"有公司员工的数据,包括部门和专业。 第二个 table 记录这些员工的假期。
这是我的主要Activity代码:
class DBHelper(context: Context) :
SQLiteOpenHelper(context, DB_Name, null, 1) {
override fun onCreate(db: SQLiteDatabase) {
db.execSQL("CREATE TABLE IF NOT EXISTS Empeloyees (EmpID INTEGER PRIMARY KEY, EmpName TEXT NOT NULL, EmpProfession TEXT NOT NULL, EmpDepartment TEXT NOT NULL, EmpPhone TEXT NOT NULL, EmpDayofbirth TEXT, EmpMonthofbirth TEXT, EmpYearofbirth TEXT, EmpDayofhire TEXT, EmpMonthofhire TEXT, EmpYearofhire TEXT)")
db.execSQL("CREATE TABLE IF NOT EXISTS Wardeya (WarID INTEGER PRIMARY KEY AUTOINCREMENT, WarName TEXT NOT NULL)")
db.execSQL("CREATE TABLE IF NOT EXISTS Permessions (PermID INTEGER PRIMARY KEY, EmpName TEXT NOT NULL, Engineer TEXT NOT NULL, Wardeya TEXT NOT NULL, PermDay TEXT NOT NULL, PermMonth TEXT NOT NULL, PermYear TEXT NOT NULL)")
db.execSQL("CREATE TABLE IF NOT EXISTS Holidays (HolidayID INTEGER PRIMARY KEY, Department TEXT NOT NULL, Profession TEXT NOT NULL, EmpName TEXT NOT NULL, DaysofHoliday TEXT NOT NULL, StartDay TEXT NOT NULL, StartMonth TEXT NOT NULL, StartYear TEXT NOT NULL, EndDay TEXT NOT NULL, EndMonth TEXT NOT NULL, EndYear TEXT NOT NULL, PresentedDay TEXT NOT NULL, PresentedMonth TEXT NOT NULL, PresentedYear TEXT NOT NULL, Engineer TEXT NOT NULL, ApproveDay TEXT NOT NULL, ApproveMonth TEXT NOT NULL, ApproveYear TEXT NOT NULL)")
}
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
db.execSQL("DROP TABLE IF EXISTS Empeloyees")
db.execSQL("DROP TABLE IF EXISTS Wardeya")
db.execSQL("DROP TABLE IF EXISTS Permessions")
db.execSQL("DROP TABLE IF EXISTS Holidays")
onCreate(db)
}
fun insertDataEmp(id: Int, name: String, prof: String, department: String, phone: String, dayofbirth: String, monthofbirth: String, yearofbirth: String, dayofhire: String, monthofhire: String, yearofhire: String) {
val db = this.writableDatabase
val contentValues = ContentValues()
contentValues.put(COL_11, id)
contentValues.put(COL_12, name)
contentValues.put(COL_13, prof)
contentValues.put(COL_14, department)
contentValues.put(COL_15, phone)
contentValues.put(COL_16, dayofbirth)
contentValues.put(COL_17, monthofbirth)
contentValues.put(COL_18, yearofbirth)
contentValues.put(COL_19, dayofhire)
contentValues.put(COL_110, monthofhire)
contentValues.put(COL_111, yearofhire)
db.insert(TABLE_EMP, null, contentValues)
}
val allDataEmp : Cursor
get() {
val db = this.writableDatabase
val res = db.rawQuery("SELECT * FROM " + TABLE_EMP, null)
return res
}
那些用于构建数据库的 r 和 tables.
我还有一个 activity 可以制作接口来插入假期数据,比如谁要求休假,他在哪个部门工作,他的职业是什么。所以我开始activity有2个snippers,第一个是在Empolyees table中搜索Departments,第二个是按departments搜索professions:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_holidays_page)
val s1 = spin1
s1.onItemSelectedListener = object : OnItemSelectedListener {
override fun onNothingSelected(parent1: AdapterView<*>?) {
}
override fun onItemSelected(parent1: AdapterView<*>?, view: View?, position: Int, id: Long) {
DepartmentTextView.text = "${parent1?.selectedItem.toString()}"
}
}
val DepartmentList = ArrayList<String>()
val ProfessionList = ArrayList<String>()
val db = dbHelper.readableDatabase
val st1 = "SELECT DISTINCT EmpProfession FROM Empeloyees where EmpDepartment=\'"+DepartmentTextView.text.toString()+"\'"
val c1 = db.rawQuery("SELECT DISTINCT EmpDepartment FROM Empeloyees", null)
val c2 = db.rawQuery(st1, null)
if (c1.moveToFirst()) {
do {
DepartmentList.add(c1.getString(c1.getColumnIndex("EmpDepartment")))
}
while (c1.moveToNext())
val mySpinner1 = findViewById(R.id.spin1) as Spinner
var adapter= ArrayAdapter(this,android.R.layout.simple_list_item_1,DepartmentList)
mySpinner1.adapter = adapter
}
if (c2.moveToFirst()) {
do {
ProfessionList.add(c2.getString(c2.getColumnIndex("EmpProfession")))
}
while (c2.moveToNext())
val mySpinner2 = findViewById(R.id.spin2) as Spinner
var adapter1 = ArrayAdapter(this, android.R.layout.simple_list_item_1, ProfessionList)
mySpinner2.adapter = adapter1
}
}
Employees table 中的第一个部门,并将它们放入数组列表 n 中,将其绑定到 snipper1 适配器。 我的主要问题是第二次搜索的光标,我尝试了所有可能的解决方案(“=运算符”、"LIKE Operator"、"MATCH Operator"),但没有在table中搜索。但是当我将光标 sql 字符串更改为 "SELECT DISTINCT EmpProfession FROM Empeloyees" 时,我得到了 snipper2 适配器。
所以知道问题出在哪里吗???
我认为您的问题是从 spinner1 中进行的选择不会导致 spinner2 发生变化。如果微调器 2 由微调器 1 驱动,那么您的效率也很低,那么您每次都需要构建一个新的适配器。
也许考虑以下示例,该示例将单个函数合并到 return 适当的 ArrayList 即 getArrayList 和管理适配器单个实例的函数即 manageSpinner1 和 manageSpinner2 注意到 spinner1 的 onItemSelected 调用 manageSpinner2.
该示例还通过addSomeData函数加载了一些测试数据(此函数仅在没有数据时添加数据)。
注意 为方便起见,使用的布局是 activity_main.xml(您只需使用您的布局)。
activity MainActivity.kt 是(请注意,您的大部分原始代码已被注释掉):-
class MainActivity : AppCompatActivity() {
lateinit var selected :String
var adapter1 :ArrayAdapter<String>? = null
var adapter2 :ArrayAdapter<String>? = null
var DepartmentList = ArrayList<String>()
var ProfessionList = ArrayList<String>()
var mySpinner1 :Spinner? = null
var mySpinner2 :Spinner? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val dbHelper = DBHelper(this)
addSomeData(dbHelper)
selected = ""
val s1 = spin1
mySpinner1 = spin1
mySpinner2 = spin2
manageSpinner1(dbHelper)
}
private fun addSomeData(dbhlepr :DBHelper) {
val db = dbhlepr.writableDatabase
if (DatabaseUtils.queryNumEntries(db,DBHelper.TABLE_EMP) > 0) return
dbhlepr.insertDataEmp(1,"Mary","Nurse","Dept1","phone1","14","03","1998","01","01","2005")
dbhlepr.insertDataEmp(2,"John","Attendant","Dept6","phone1","14","03","1998","01","01","2005")
dbhlepr.insertDataEmp(3,"Susan","Doctor","Dept15","phone1","14","03","1998","01","01","2005")
dbhlepr.insertDataEmp(4,"Geoff","Surgeon","Dept25","phone1","14","03","1998","01","01","2005")
}
private fun manageSpinner1(dbHelper: DBHelper) {
DepartmentList.clear()
DepartmentList.addAll(getArrayList(dbHelper, TYPE_DEPT))
if (adapter1 == null) {
adapter1 = ArrayAdapter(this,android.R.layout.simple_list_item_1,DepartmentList)
spin1.adapter = adapter1
spin1.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onNothingSelected(parent1: AdapterView<*>?) {}
override fun onItemSelected(parent1: AdapterView<*>?, view: View?, position: Int, id: Long) {
selected = "${parent1?.selectedItem.toString()}"
manageSpinner2(dbHelper)
}
}
} else {
adapter1!!.notifyDataSetChanged()
}
}
private fun manageSpinner2(dbHelper: DBHelper) {
Log.d("SPINNER2","Managing Spinner 2 selected department is " + selected)
ProfessionList.clear()
ProfessionList.addAll(getArrayList(dbHelper, TYPE_PROF))
if (adapter2 == null) {
adapter2 = ArrayAdapter(this,android.R.layout.simple_list_item_1,ProfessionList)
spin2.adapter = adapter2
spin2.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onNothingSelected(parent1: AdapterView<*>?) {}
override fun onItemSelected(parent1: AdapterView<*>?, view: View?, position: Int, id: Long) {
}
}
} else {
adapter2!!.notifyDataSetChanged()
}
}
private fun getArrayList(dbHelper: DBHelper, type: Int) :ArrayList<String> {
var rv = ArrayList<String>()
var query = ""
val db = dbHelper.writableDatabase
if (type == TYPE_DEPT) {
query =" SELECT " + DBHelper.COL_14 + " FROM " + DBHelper.TABLE_EMP + " GROUP BY " + DBHelper.COL_14
} else {
query = "SELECT " + DBHelper.COL_13 + " FROM " + DBHelper.TABLE_EMP +
" WHERE " + DBHelper.COL_14 + "='" + selected + "'"
" GROUP BY " + DBHelper.COL_13
}
Log.d("GETARRAYLIST","Query is \n\t" + query)
val c = db.rawQuery(query,null)
while (c.moveToNext()) {
rv.add(c.getString(0))
}
c.close()
return rv
}
companion object {
const val TYPE_DEPT = 1
const val TYPE_PROF = 2
}
}
结果
当第一次 运行 :-
微调器 1 已展开:-
部门15已选择(专业博士):-
等等。
请注意,Spinner2 可能只是一个 TextView,因为所选部门只会有 1 个专业。