【发布时间】:2020-11-10 05:17:46
【问题描述】:
我是一名 Swift / SwiftUI 新手,正在尝试将我内置的 FMDB 表集成到我的应用程序中。我已经能够通过直接调用 FMDB 表来填充我的列表,现在希望能够从列表中删除一个项目以及 FMDB 表中的相应基础数据。我似乎无法弄清楚如何获取底层行数据才能运行 SQL 以删除相应的表数据。在表的类中,我有:
// Budgeted_expense record for FMDB
struct BudgetedExpenseRecord: Hashable {
var expense_id: Int!
var account_code: Int!
var budget_code: Int!
var expense_code: Int!
var budget_year: Int!
var budget_month: Int!
var description: String!
var category: String!
var expense_budget: Double!
var expense_spent: Double!
var unexpected_expense: Double!
var category_code: Int!
var hidden: Bool!
}
对 DBMANAGER 的调用是:
// Select BudgetedExpense records for a given year / month
func selectBudgetedExpense(account_code: Int, budget_code: Int, year: Int, month: Int) -> [BudgetedExpense.BudgetedExpenseRecord]
{
var budgeted_expense_results: [BudgetedExpense.BudgetedExpenseRecord]
if openDatabase(){
budgeted_expense_results = BudgetedExpense.shared.selectBudgetedExpense(database: database, query: BudgetedExpense.shared.selectBudgetedExpense(account_code: account_code, budget_code: budget_code, year: year, month: month))
if checkTables {
print("\nQUERY: BudgetedExpense.shared.selectBudgetedExpense(account_code: \(account_code), budget_code: \(budget_code), year: \(year), month: \(month)")
print(BudgetedExpense.shared.selectBudgetedExpense(account_code: account_code, budget_code: budget_code, year: year, month: month))
}
database.close()
return budgeted_expense_results
}else {
print("Database was not opened. Couldn't execute the query. Returning empty results")
fatalError("Database was not opened. Couldn't execute the query. Returning empty results")
}
}
在我的 SwiftUI 视图中,我可以填充如下列表:
List {
ForEach (DBManager.shared.selectBudgetedExpense(account_code: self.account_code, budget_code: self.budget_code, year: self.budget_year, month: self.budget_month), id: \.self) { record in
BudgetedExpenseEditRow(
expense_id: record.expense_id,
account_code: record.account_code,
budget_code: record.budget_code,
budget_year: record.budget_year,
budget_month: record.budget_month,
description: record.description,
category: record.category,
expense_budget: roundToPlaces(value: record.expense_budget,
places: 3),
expense_spent: record.expense_spent,
unexpected_expense: record.unexpected_expense,
hidden: record.hidden
)
}
.onDelete(perform: self.delete)
}.navigationBarTitle("Budgeted Expenses")
我无法弄清楚onDelete 如何获得expense_id,它是表中唯一的行ID,以便我可以调用删除SQL?
【问题讨论】:
-
您必须将记录存储在本地属性中,然后在删除时您可以通过索引获得所需的重新编码。提供了类似的解决方案in this port
-
感谢您的说明,虽然不是对我问题的完整答案,但它确实让我走上了正确的轨道,能够获得所需的信息。我将数据库调用放入本地数组变量中然后能够按照您的建议进行操作。