一尘不染

嵌套的FutureBuilder与嵌套调用以从数据库进行延迟加载

flutter

我需要在可以遵循的两种方法之间选择最佳方法。

我有一个Flutter应用程序,用于sqflite保存数据,在数据库内部,我有两个表:

雇员:

+-------------+-----------------+------+
| employee_id | employee_name   |dep_id|
+-------------+-----------------+------+
|     e12     | Ada Lovelace    | dep1 |
+-------------+-----------------+------+
|     e22     | Albert Einstein | dep2 |
+-------------+-----------------+------+
|     e82     | Grace Hopper    | dep3 |
+-------------+-----------------+------+

SQL:

CREATE TABLE Employee(
    employee_id TEXT NOT NULL PRIMARY KEY,
    employee_name TEXT NOT NULL ,
    dep_id TEXT,
    FOREIGN KEY(dep_id) REFERENCES Department(dep_id)
    ON DELETE SET NULL
);

部门:

+--------+-----------+-------+
| dep_id | dep_title |dep_num|
+--------+-----------+-------+
| dep1   | Math      | dep1  |
+--------+-----------+-------+
| dep2   | Physics   | dep2  |
+--------+-----------+-------+
| dep3   | Computer  | dep3  |
+--------+-----------+-------+

SQL:

CREATE TABLE Department(
    dep_id TEXT NOT NULL PRIMARY KEY,
    dep_title TEXT NOT NULL ,
    dep_num INTEGER,
);

我需要显示ListGrid存储在 Employee 表中的部门。我应该查看 Employee
表并从中获取部门ID,这很容易,但是在获取后,dep_id我需要从这些ID中制作一张卡,因此我需要 Department 表中的信息。我从
Emplyee 表中获取的那些ID的完整信息位于 Department 表中。

每个表中有数千行。

我有一个数据库助手类可以连接到数据库:

DbHelper 是这样的:

Future<List<String>> getDepartmentIds() async{
    'fetch all dep_id from Employee table'
}

Future<Department> getDepartment(String id) async{
    'fetch Department from Department table for a specific id'
}

Future<List<Department>> getEmployeeDepartments() async{
    '''1.fetch all dep_id from Employee table
    2.for each id fetch Department records from Department table'''

    var ids = await getDepartmentIds();
    List<Departments> deps=[];
    ids.forEach((map) async {
        deps.add(await getDepartment(map['dep_id']));
      });
}

有两种方法:

第一:

  1. 在dbhelper定义一个函数,所有收益dep_id员工 表(getDepartmentIds和其他功能,对于该特定ID返回一个部门的对象(模型)。( getDepartment

  2. 现在,我FutureBuilder彼此之间需要两个,一个用于获取id,另一个用于获取部门模型。

第二个:

  1. 定义,首先取IDS则该函数的每个ID都是马培德到系车型内部的功能。( getEmployeeDepartments
  2. 所以我需要一个FutureBuilder

哪一个更好??我应该让FutureBuilders处理它还是应该施加压力dbHelper以应对它?

如果我使用第一种方法,则必须(据我所能想象的那样!)将第二个以后的调用(基于id()获取 Department
Object(model)的那个getDepartment)放在build函数上,建议不要这样做所以。

第二个问题是它在中进行了许多嵌套调用dbHelper

我用来ListView.builder表演。

我检查了一些数据,但无法弄清楚哪个更好。我猜这取决于flutter和sqlite(sqflite)。

哪个更好,或者有更好的方法?


阅读 447

收藏
2020-08-13

共1个答案

一尘不染

鉴于在此示例中看不到太多代码,我将对您的问题做一个高级回答。

评估方法一

  1. 马上,这部分内容就突出了:“从Employee表中返回所有dep_id”
  2. 我想从头开始说,因为“全部返回”通常都不是一个好的解决方案,尤其是因为您提到表中有很多行。

评估方法二

  1. 由于相同的原因,我不确定与第一种方法相比在性能上有什么不同,这似乎也很糟糕。我认为这只是改变您的UI逻辑而已。

典型的“无尽”列表方法

  1. 您将对 Employees 表进行查询,并加入 Departments 表。
  2. 您将在UI上实现分页,并将值从第一步开始传递给查询。
  3. 从根本上讲,您将需要以下变量:Take,Skip,HasMore
  4. 取: 请求每个查询的项目数
  5. 跳过: 下一个查询要跳过的项目数,即当前驱动用户界面的列表中当前拥有的项目数的大小。
  6. HasMore: 您可以在每个查询的响应中设置此项,以使UI知道是否还有更多项目。
  7. 向下滚动列表时,到达底部时,您将请求更多物品。

最初发出一个查询,例如:取:10,跳过:0按下UI底部时的下一个查询:取:10,跳过:10等。

示例SQL查询:

SELECT * 
FROM Employees E
   JOIN Departments D on D.id = E.dept_id
order by E.employee_name  
offset {SKIP#} rows
FETCH NEXT {TAKE#} rows only

希望这会有所帮助,就代码而言,我不确定您实际上要做什么。

2020-08-13