android - 在 SQLite Android 中为关系制作和使用外键
问题描述
假设我有一个 android studio 应用程序,我可以在其中添加公司,并且在这些公司内部我还可以添加员工。现在,我正在尝试让员工列表仅显示我之前选择的公司的元素(在显示员工的独特活动中)。
我创建了两个类:
data class Company(val id:Int, val name:String, val telephone:String)
data class Employee (val id:Int, val name:String, val telephone:String, val idCompany:Int)
在我的 SQLiteHelper 中,我为每个表创建了表,并在员工中使用外键来建立关系
private val TABLE_COMPANY = "CompanyTable"
private val TABLE_EMPLOYEE = "EmployeeTable"
//Company table
private val COMPANY_ID = "_id"
private val COMPANY_NAME = "name"
private val COMPANY_TL = "telephone"
//Employee table
private val EMPLOYEE_ID = "id"
private val EMPLOYEE_NAME = "name"
private val EMPLOYEE_TL = "telephone"
private val EMPLOYEE_COMPANY_ID = "id"
}
override fun onCreate(db: SQLiteDatabase?) {
val CREATE_COMPANY_TABLE = ("CREATE TABLE " + TABLE_COMPANY + "("
+ COMPANY_ID + " INTEGER PRIMARY KEY,"
+ COMPANY_NAME + " TEXT,"
+ COMPANY_TL + " TEXT" + ")")
val CREATE_EMPLOYEE_TABLE = ("CREATE TABLE " + TABLE_EMPLOYEE + "("
+ EMPLOYEE_ID + " INTEGER PRIMARY KEY,"
+ EMPLOYEE_NAME + " TEXT,"
+ EMPLOYEE_TL + " INTEGER,"
+ EMPLOYEE_COMPANY_ID + " INTEGER,"
+ " FOREIGN KEY ("+ EMPLOYEE_COMPANY_ID+") REFERENCES "+TABLE_COMPANY+"("+ COMPANY_ID+"))")
db?.execSQL(CREATE_EMPLOYEE_TABLE)
db?.execSQL(CREATE_COMPANY_TABLE)
}
所以,我用recyclerviews做了两项活动,一项针对公司,另一项针对员工。当我单击一家公司时,员工活动将打开并显示他们的列表。
但它显示了我拥有的所有员工,所以我试图弄清楚如何只显示我保存的与我在上一个活动中单击的公司 ID 相同的员工。
但我现在不知道如何进行
这是显示员工的 DAO 函数:
fun viewEmployee(): ArrayList<Employee> {
val empList: ArrayList<Employee> = ArrayList<Employee>()
// Query to select the records
val selectQuery = "SELECT L.$EMPLOYEE_NAME, L.$EMPLOYEE_TL, L.$EMPLOYEE_ID, L.$EMPLOYEE_COMPANY_ID, C.$COMPANY_ID" +
"FROM $TABLE_EMPLOYEE as L, $TABLE_COMPANY as C" +
"WHERE L.$EMPLOYEE_COMPANY_ID = C.$COMPANY_ID"
val db = this.readableDatabase
var cursor: Cursor? = null
try {
cursor = db.rawQuery(selectQuery, null)
} catch (e: SQLiteException) {
db.execSQL(selectQuery)
return ArrayList()
}
var id: Int
var name: String
var telephone: String
var idCompany: Int
if (cursor.moveToFirst()) {
do {
id = cursor.getInt(cursor.getColumnIndex(EMPLOYEE_ID))
name = cursor.getString(cursor.getColumnIndex(EMPLOYEE_NAME))
telephone = cursor.getString(cursor.getColumnIndex(EMPLOYEE_TL))
idCompany = cursor.getInt(cursor.getColumnIndex(EMPLOYEE_COMPANY_ID))
val employee = Employee(id = id, name = name, telephone = telephone, idCompany = idCompany)
empList.add(employee)
} while (cursor.moveToNext())
}
return empList
}
这是向员工展示的活动
class ManagerEmp : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_manager_emp)
setList()
createEmp.setOnClickListener{
val intent = Intent(this, CreateEmp::class.java)
startActivity(intent)
}
}
/**
* Gets DB employee list
*/
private fun getItemsList(): ArrayList<Employee> {
//creating the instance of DatabaseHandler class
val databaseHandler = DataBaseHelper(this)
//calling the viewEmployee method of DatabaseHandler class to read the records
val empList: ArrayList<Employee> = databaseHandler.viewEmployee()
return empList
}
/**
* Generates the list
*/
private fun setList() {
recyclerEmp.layoutManager = LinearLayoutManager(this)
val itemAdapter = empAdapter(this, getItemsList())
recyclerEmp.adapter = itemAdapter
}
}
这听起来很简单,但它不是(至少对我来说)我想获取公司的 id 值并将其传递给员工列表活动,所以我可以用来比较它,但是我知道如何,我很新在 kotlin 中(以及一般的编程)
如果你能给出答案,你就救了我的命。
帮助
解决方案
首先,您必须获得companyId
要过滤的依据。例如,可以通过在 RecyclerView 添加 onClickListener来完成。
然后,您将需要额外的查询,用于按 companyId 进行过滤。
例如,如果companyId
存储在filteredCompanyId
变量中,您可以添加额外的过滤条件 ( WHERE ... AND C.$COMPANY_ID == $filteredCompanyId
):
val filteredCompanyId = 5
val query = """
SELECT L.$EMPLOYEE_NAME,
L.$EMPLOYEE_TL,
L.$EMPLOYEE_ID,
L.$EMPLOYEE_COMPANY_ID,
C.$COMPANY_ID
FROM $TABLE_EMPLOYEE AS L,
$TABLE_COMPANY AS C
WHERE L.$EMPLOYEE_COMPANY_ID = C.$COMPANY_ID
AND C.$COMPANY_ID == $filteredCompanyId
"""
推荐阅读
- excel - 更新 PowerQuery 函数以从命名表的列和行返回数据,而不仅仅是特定列中的行
- excel - EXCEL Add-in Windows 到 Apple 的转换
- sql - 频繁 DML 的索引组织表
- javascript - 这个带有双花括号的 HTML 中使用了什么语言?
- r - 写 `"T1", "T2", ... "T1000"` 作为因子
- swift - Publisher mapError 与组合框架
- oracle - 创建存储选择过程 oracle 11g
- amazon-web-services - 设置 AWS Secrets Manager .Net Core
- linux - 如何通过 Linux KVM 虚拟化在主机和来宾上使用相同的 IP 地址?
- python - 将 pandas DataFrame 转换为具有最内层对象层的深度嵌套 JSON