Sql flatter sqflite从一个表中获取所有数据以及它';s子表
我有两个表定义了一个任务,它是子任务:Sql flatter sqflite从一个表中获取所有数据以及它';s子表,sql,flutter,sqlite,Sql,Flutter,Sqlite,我有两个表定义了一个任务,它是子任务: db.transaction((Transaction txn) async { txn.execute("CREATE TABLE ${Tasks.tblTask} (" "${Tasks.dbId} INTEGER PRIMARY KEY AUTOINCREMENT," "${Tasks.dbServerId} INTEGER,"
db.transaction((Transaction txn) async {
txn.execute("CREATE TABLE ${Tasks.tblTask} ("
"${Tasks.dbId} INTEGER PRIMARY KEY AUTOINCREMENT,"
"${Tasks.dbServerId} INTEGER,"
"${Tasks.dbTitle} TEXT,"
"${Tasks.dbCreateTime} LONG,"
"${Tasks.dbComment} TEXT,"
"${Tasks.dbCommentUpdateTime} LONG,"
"${Tasks.dbDueDate} LONG,"
"${Tasks.dbDueTime} LONG,"
"${Tasks.dbCompleteTime} LONG,"
"${Tasks.dbPriority} LONG,"
"${Tasks.dbProjectID} LONG,"
"${Tasks.dbTaskTypeID} LONG,"
"${Tasks.dbStatus} LONG,"
"${Tasks.dbTaskColorName} TEXT,"
"${Tasks.dbTaskColorCode} INTEGER,"
"${Tasks.dbRepeatedType} INTEGER,"
"${Tasks.dbRepeatedId} INTEGER,"
"${Tasks.dbRepeatedPer} INTEGER,"
"${Tasks.dbRepeatedUnit} INTEGER,"
"${Tasks.dbRepeatedNumbers} TEXT,"
"${Tasks.dbUserAddr} TEXT,"
"${Tasks.dbProgress} REAL,"
"${Tasks.dbCostTime} INTEGER,"
"${Tasks.dbShared} INTEGER,"
"FOREIGN KEY(${Tasks.dbProjectID}) REFERENCES ${Project.tblProject}(${Project.dbId}) ON DELETE CASCADE "
"UNIQUE (${Tasks.dbCreateTime}));");
db.transaction((Transaction txn) async {
txn.execute("CREATE TABLE ${SubTask.tblSubTask} ("
"${SubTask.dbId} INTEGER PRIMARY KEY AUTOINCREMENT,"
"${SubTask.dbTaskId} LONG,"
"${SubTask.dbTaskServerId} LONG,"
"${SubTask.dbServerId} LONG,"
"${SubTask.dbUserAddr} TEXT,"
"${SubTask.dbTitle} TEXT,"
"${SubTask.dbComment} TEXT,"
"${SubTask.dbCommentUpdateTime} LONG,"
"${SubTask.dbDueTime} LONG,"
"${SubTask.dbCompleteTime} LONG,"
"${SubTask.dbCreateTime} LONG,"
"${SubTask.dbPriority} LONG,"
"${SubTask.dbTaskTypeID} LONG,"
"${SubTask.dbStatus} LONG,"
"${SubTask.dbTaskColorName} TEXT,"
"${SubTask.dbTaskColorCode} INTEGER,"
"${SubTask.dbProgress} REAL,"
"${SubTask.dbCostTime} INTEGER,"
"FOREIGN KEY(${SubTask.dbTaskId}) REFERENCES ${Tasks.tblTask}(${Tasks.dbId}) ON DELETE CASCADE "
"UNIQUE (${SubTask.dbCreateTime}));");
});
这就是我定义2表的方式
现在,我想从表中获取所有任务,我应该如何获取所有任务及其子任务
注意:任务可能包含多个子任务
更新: 我尝试了这个SQL查询,它返回我的子任务,但只返回第一个子任务(rest无法检索): 我想要的是返回我的[Task,Task,Task,Task….]列表 在某些任务中,它将有一个列表[子任务,子任务…] 所以它看起来像: [任务[子任务,子任务],任务,任务[子任务,子任务,子任务]]
正如我在第一个答案中提到的我已经尝试了查询任务,并循环它,然后查询任务的子任务,但是这很慢!!!我已经不赞成这种方式了!!我需要一个SQL语句或至少是最有效的方法来实现这一点也许下面的代码可以解决您的问题。我这么说可能是因为我不知道你的任务、子任务模型是怎样的。此外,在运行的更新查询中,您似乎有更多的模型,如Project等。 我坚持任务和子任务,因为你们的问题只涉及这两个方面。对代码进行适度注释,以突出其目的或假设
未来的GetTaskWithSubTasks()异步{
final Database db=wait Database;//获取数据库实例
最终res=等待分贝
.query(Tasks.dbId);//检索所有任务及其所有属性
List taskList=res.isNotEmpty
?res.map((c)=>Task.fromJson(c)).toList()
:[];//映射到域中的对象
//现在,根据任务的'id'检索与任务关联的所有子任务,并将它们添加到任务中
//我假设您的'Task'模型有一个属性subtasks,它是一个列表
for(任务列表中的var任务){
var subtasksRaw=await db.query(SubTask.tblSubTask,
哪里:
“${SubTask.dbTaskId}=${task.id}”);//假设任务有一个属性'id'`
列表子任务列表=
res.isNotEmpty?res.map((c)=>SubTask.fromJson(c)).toList():[];
task.subtask.addAll(subtaskList);
}
//现在我们的模型应该是您想要的[任务[子任务,子任务],任务[],任务[子任务,子任务,子任务]]。
返回任务列表;
}
如果只需要与任务相关的子任务,则SQL查询如下:
SELECT
task.id as task_id,
task.name as task_name,
sub_task.name as subtask_name,
sub_task.id as subtask_id
FROM task
LEFT JOIN sub_task
ON task.id = sub_task.task_id
WHERE task.id = 2
假设您的任务表类似于:
id name
1 task 1
2 task 2
3 task 3
您的子任务表如下所示:
id name task_id
1 sub task 1 1
2 sub task 2 2
3 sub task 3 1
4 sub task 4 1
5 sub task 5 3
6 sub task 6 1
7 sub task 7 3
8 sub task 8 2
9 sub task 9 1
10 sub task 10 null
11 sub task 11 null
12 sub task 12 null
查询结果如下所示:
task_id task_name subtask_name subtask_id
2 task 2 sub task 2 2
2 task 2 sub task 8 8
然后,您可以轻松使用结果创建所需的结构:
Future getTasksWithSubtasks()异步{
final Database db=wait Database;//获取数据库实例
//res是这样的:
/*
[
{
任务编号:2,
任务名称:“任务2”,
子任务名称:“子任务2”,
子任务id:2
},
{
任务编号:2,
任务名称:“任务2”,
子任务名称:“子任务8”,
子任务id:8
}
]
*/
最终列表res=wait db.rawQuery(“”)
挑选
task.id作为task_id,
task.name作为task_name,
sub_task.name作为subtask_name,
子任务id作为子任务id
从任务
左连接子任务
ON task.id=sub_task.task_id
其中task.id=2
“”;//检索具有相关子任务的所有任务
列出任务=[];
var pos=-1;
无功电流=-1;
对于(变量i=0;i
注意:您可以调整单个任务和相关子任务的SQL查询和方法
示例数据SQL
如果任务存在,则删除表;
创建表任务(
id int,
名称varchar
);
在任务(id、名称)中插入值(1,“任务1”);
在任务(id、名称)中插入值(2,“任务2”);
在任务(id、名称)中插入值(3,“任务3”);
如果存在子任务,则删除表;
创建表子任务(
id int,
名字叫瓦查尔,
任务id int
);
在子任务(id、名称、任务id)中插入值(1,“子任务1”,1);
在子任务(id、名称、任务id)中插入值(2,“子任务2”,2);
在子任务(id、名称、任务id)中插入值(3,“子任务3”,1);
在子任务(id、名称、任务id)中插入值(4,“子任务4”,1);
在子任务(id、名称、任务id)中插入值(5,“子任务5”,3);
在子任务(id、名称、任务id)中插入值(6,“子任务6”,1);
在子任务(id、名称、任务id)中插入值(7,“子任务7”,3);
在子任务(id、名称、任务id)中插入值(8,“子任务8”,2);
在子任务(id、名称、任务id)中插入值(9,“子任务9”,1);
在子任务(id、名称、任务id)中插入值(10,“子任务10”);
插入子任务(id、名称、任务id)值(11,“子任务11”);
插入子任务(id、名称、任务id)值(12,“子任务12”);
我只需要一个SQL查询来获取所有任务和子任务。我发现SQL无法查询项及其子列表项,因此请帮助发布示例数据和预期结果,以澄清您的需求。我只需要一个SQL语句来获取数据,我得到了一个简短的结果,希望与示例数据共享。我无法提供完整的示例,因为这是Flatter项目。如果您理解我的问题,我只需要一个SQL语句查询出所有任务,子任务属于每个任务。我已经更新了我的表c
task_id task_name subtask_name subtask_id
2 task 2 sub task 2 2
2 task 2 sub task 8 8