我有一个有两个表的数据库,每个表都有自己的类,有toMap和fromMap方法。每个表都有一个provider和SQLhelper类,带有CRUD。我的问题是,当我只有表1(父表)的上下文时,我如何访问表2。我的想法是访问模型类secondTable()。
secondtable.id是引用www.example.com的外键firsttable.id
在我的第二个表sql操作中,我尝试这样做:
Future<List<Map<String, dynamic>>> getData(int firstTableId) async {
final db = SQLite.db;
List<Map<String, dynamic>> results = await db.rawQuery('''
SELECT *
FROM secondtable
INNER JOIN firsttable ON secondtable.id = firsttable.id
WHERE id = ?
''', [firstTableId]);
return results;
之后我有一个提供者:
Future<SecondTable?> getData(int firstTableId) async {
final results = await _databaseHelper.getData(firstTableId);
if (results.isNotEmpty) {
Map<String, dynamic> row = results.first;
SecondTable secondTable = SecondTable.fromMap(row);
return secondTable;
} else {
return null;
}
}
在我需要信息的页面中,我这样称呼提供者:
@override
void initState() {
super.initState();
_seconTableDataProvider =
Provider.of<SecondTableDataProvider>(context, listen: false);
loadSecondTable();
}
FirstTable _firstTable = FirstTable();
SecondTable? _secondTable = SecondTable();
Future<void> loadSecondTable() async {
_secondTable = await _seconTableDataProvider.getData(_firstTable.id!);
}
我总是有一个类型转换错误,因为返回给我null。如果我硬编码一个id,比如:
_seconTableDataProvider.getData(1);
问题是DatabaseException(不明确的列名:身份证
但是如果我创建一个新的变量作为外键,它不会取引用的firstTable列的值,也不会取空值。
我不知道该怎么办。
1条答案
按热度按时间lvmkulzt1#
SQL语法中存在问题。正确的解决方法是:
之后,您必须确保初始化_firstTable。
最后你需要注意对loadSecondTable函数的异步调用,因为它需要时间来访问数据,所以使用Futurebuilder或其他选项。