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

首先,我在科特林(Kotlin)no业业,试图在家学习,开始为我工作的公司制定程序。 制成的SQLite数据库包含4个表,其中之一是“ Empeloyees”,其中包含公司员工的数据,包括部门和专业。 第二张表记录了这些员工的假期。

这是我的主要活动代码:

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,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,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,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,contentvalues)
    }

    val allDataEmp : Cursor
        get() {
            val db = this.writableDatabase
            val res = db.rawQuery("SELECT * FROM " + TABLE_EMP,null)
            return res
        }

用于构建数据库和表的r。

我还有另一个活动,该活动使界面可以插入“假期”数据,例如谁要求休假,他工作的部门或专业。因此,我从2个窥探者开始了活动,一个是在Empolyees表中搜索Departments,第二个是根据部门搜索职业:

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,ProfessionList)
            mySpinner2.adapter = adapter1
        }
    }

Employees表中的第一个部门并将其放入数组列表n将其绑定到snipper1适配器。 我的主要问题是第二次搜索的游标,我尝试了所有可能的解决方案(“ =运算符”,“ LIKE运算符”,“ MATCH运算符”),它们在表中均未搜索。但是,当我将游标sql字符串更改为“从Empeloyees选择SELECTTINTINCT EmpProfession”时,我得到了snipper2适配器。

所以知道哪里出了问题吗?

wangyjmiss 回答:在Kotlin中搜索sqlite数据库时出现问题

我相信您的问题是从spinner1中进行的选择不会驱动spinner2进行更改。您还会遇到效率低下的问题,如果将Spinner1驱动Spinner 2,则每次都会构建一个新的适配器。

也许考虑以下示例,该示例合并了一个函数以返回适当的ArrayList即 getArrayList 和管理适配器的单个实例的函数即 manageSpinner1 manageSpinner2 注意到spinner1的 onItemSelected 会调用 manageSpinner2

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

注意,为方便起见,使用的布局为 activity_main.xml (您只需使用布局即可)。

活动 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","2005")
        dbhlepr.insertDataEmp(2,"John","Attendant","Dept6","2005")
        dbhlepr.insertDataEmp(3,"Susan","Doctor","Dept15","2005")
        dbhlepr.insertDataEmp(4,"Geoff","Surgeon","Dept25","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,ProfessionList)
            spin2.adapter = adapter2
            spin2.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
                override fun onNothingSelected(parent1: AdapterView<*>?) {}

                override fun onItemSelected(parent1: AdapterView<*>?,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
    }
}

结果

首次运行时:-

enter image description here

Spinner1展开了:-

enter image description here

选择了

Dept15 (专业医生):-

enter image description here

以此类推。

请注意,Spinner2只能是TextView,因为选定部门只能有1个专业。

本文链接:https://www.f2er.com/3114124.html

大家都在问