sqlite 通过父表访问SQL模型类的方法

i86rm4rw  于 2023-02-23  发布在  SQLite
关注(0)|答案(1)|浏览(173)

我有一个有两个表的数据库,每个表都有自己的类,有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列的值,也不会取空值。
我不知道该怎么办。

lvmkulzt

lvmkulzt1#

SQL语法中存在问题。正确的解决方法是:

List<Map<String, dynamic>> results = await db.rawQuery('''
    SELECT secondtable.*
    FROM secondtable
    INNER JOIN firsttable ON secondtable.firstTableId = firsttable.id
    WHERE firsttable.id = ?
  ''', [firstTableId]);

之后,您必须确保初始化_firstTable。

@override
  void initState() {
    super.initState();
_secondTableDataProvider =
        Provider.of<SecondTableDataProvider>(context, listen: false);
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    _firstTable = ModalRoute.of(context)!.settings.arguments as FirstTable;
    loadSecondTable();
  }

最后你需要注意对loadSecondTable函数的异步调用,因为它需要时间来访问数据,所以使用Futurebuilder或其他选项。

相关问题