Database 在kotlin中搜索sqlite数据库时出现问题

Database 在kotlin中搜索sqlite数据库时出现问题,database,search,kotlin,android-sqlite,crud,Database,Search,Kotlin,Android Sqlite,Crud,首先,我是Kotlin的nobbie,努力在家学习,开始为我工作的公司制作一个程序。 Make SQLite数据库由4个表组成,其中一个是“Empeloyes”,其中包含公司员工的数据,包括部门和专业。 第二个表记录了这些员工的假期 这是我的主要活动代码: class DBHelper(context: Context) : SQLiteOpenHelper(context, DB_Name, null, 1) { override fun onCreate(db: SQLite

首先,我是Kotlin的nobbie,努力在家学习,开始为我工作的公司制作一个程序。 Make SQLite数据库由4个表组成,其中一个是“Empeloyes”,其中包含公司员工的数据,包括部门和专业。 第二个表记录了这些员工的假期

这是我的主要活动代码:

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用于构建数据库和表

我还有另一个活动,它使接口插入假日数据,比如谁要求休假,他在哪个部门工作,他从事什么职业。所以我用两个狙击手开始了这项活动,一个是在员工表中搜索部门,第二个是根据部门搜索职业:

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
        }
    }
override-fun-onCreate(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity\u holidays\u页面)
val s1=spin1
s1.onItemSelectedListener=对象:onItemSelectedListener{
是否在未选择的情况下覆盖乐趣(parent1:AdapterView?){
}
覆盖已选择(父项1:AdapterView?,视图:view?,位置:Int,id:Long){
DepartmentTextView.text=“${parent1?.selectedItem.toString()}”
}
}
val部门列表=ArrayList()
val ProfessionList=ArrayList()
val db=dbHelper.readableDatabase
val st1=“从Employees中选择不同的EmpProfessional,其中EmpDepartment=\'”+DepartmentTextView.text.toString()+“\'”
val c1=db.rawQuery(“从Empeloyes中选择不同的部门”,null)
val c2=db.rawQuery(st1,null)
if(c1.moveToFirst()){
做{
DepartmentList.add(c1.getString(c1.getColumnIndex(“EmpDepartment”))
}
而(c1.moveToNext())
val mySpinner1=findViewById(R.id.spin1)作为微调器
var adapter=ArrayAdapter(这是android.R.layout.simple\u list\u item\u 1,DepartmentList)
mySpinner1.adapter=适配器
}
if(c2.moveToFirst()){
做{
添加(c2.getString(c2.getColumnIndex(“EmpProfession”))
}
while(c2.moveToNext())
val mySpinner2=findViewById(R.id.spin2)作为微调器
var adapter1=ArrayAdapter(这个,android.R.layout.simple\u list\u item\u 1,ProfessionList)
mySpinner2.adapter=适配器1
}
}
从Employees表中选择第一个部门并将其放入数组列表中,然后将其绑定到snipper1适配器。 我的主要问题是第二次搜索的光标,我尝试了所有可能的解决方案(“=运算符”、“LIKE运算符”、“MATCH运算符”),但都没有在表中搜索。但当我将游标sql字符串更改为“从Empeloyes中选择不同的Employees”时,我得到了snipper2适配器


你知道问题出在哪里吗?

我相信你的问题在于,从喷丝头1中选择喷丝头2并不会促使喷丝头2发生变化。如果Spinner2由spinner1驱动,那么每次都会构建一个新的适配器,这也是低效的

也许考虑下面的例子,其中包含一个函数来返回适当的ARARYLIST,即“强> GETARAYLISTAB/Stand”和管理适配器的单个实例的函数,即“强>管理器PNELN1和<强>管理器PNELN2<强>注意到SPNENL1的<强> OnITMeNe> <强>调用管理喷丝头2

该示例还通过addSomeData函数加载一些测试数据(当没有数据时,此onlt会添加数据)

注意为方便起见,所使用的布局是activity\u main.xml(您只需使用布局即可)

activityMainActivity.kt是(请注意,您的许多原始代码已被注释掉):-

class MainActivity:AppCompatActivity(){
已选择lateinit变量:字符串
变量适配器1:ArrayAdapter?=null
变量适配器2:ArrayAdapter?=null
var DepartmentList=ArrayList()
var ProfessionList=ArrayList()
var mySpinner1:微调器?=null
var mySpinner2:微调器?=null
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val dbHelper=dbHelper(此)
addSomeData(dbHelper)
selected=“”
val s1=spin1
mySpinner1=spin1
mySpinner2=spin2
manageSpinner1(dbHelper)
}
private fun addSomeData(dbhlepr:DBHelper){
val db=dbhlepr.writeabledatabase
if(DatabaseUtils.queryNumEntries(db,DBHelper.TABLE_EMP)>0)返回
dbhlepr.insertDataEmp(1,“玛丽”、“护士”、“部门1”、“电话1”、“14”、“03”、“1998”、“01”、“01”、“2005”)
dbhlepr.insertDataEmp(2,“约翰”,“服务员”,“部门6”,“电话1”,“14”,“03”,“1998”,“01”,“01”,“2005”)
dbhlepr.insertDataEmp(3,“苏珊”,“医生”,“部门15”,“电话1”,“14”,“03”,“1998”,“01”,“01”,“2005”)
dbhlepr.insertDataEmp(4,“杰夫”,“外科医生”,“部门25”,“电话1”,“14”,“03”,“1998”,“01”,“01”,“2005”)
}
私人娱乐管理器Spinner1(dbHelper:dbHelper){
部门列表。清除()
DepartmentList.addAll(getArrayList(dbHelper,TYPE_DEPT))
if(适配器1==null){
adapter1=ArrayAdapter(这是android.R.layout.simple\u list\u item\u 1,DepartmentList)
spin1.adapter=适配器1
spin1.onItemSelectedListener=对象:AdapterView.onItemSelectedListener{
覆盖未选择的乐趣(parent1:AdapterView?{}
覆盖已选择(父项1:AdapterView?,视图:view?,位置:Int,id:Long){
selected=“${parent1?.selectedItem.toString()}”
manageSpinner2(dbHelper)
}
}
}否则{
适配器1!!.notifyDataSetChanged()
}
}
脉波重复间隔
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
    }
}