问题描述
@override
Widget build(BuildContext context) {
User user;
if(_users != null && _users.length > 0) {
user = _users[index];
}
return Scaffold(
appBar: AppBar(
title: Text(_loading ? 'Loading...' : 'Users'),),body: Container(
color: Colors.white,child: ListView.builder(
itemCount: user?.clientInfos?.length ?? 0,itemBuilder: (context,index) {
return ListTile(
title: Text(user.clientInfos[index].cLINTNAME),subtitle: Text(user.clientInfos[index].cLINTEMAIL),);
},);
}
使用此架构,您可以为一对位置创建 2 条不同的旅程,一条用于进路,另一条用于返回。我想要的是为每对位置强制执行一次旅程。有哪些选项可以做到这一点?
解决方法
最简单的方法是强制执行“方向”,然后使用唯一约束:
create table Journey (
id integer primary key,id_from integer foreign key references Location(id),id_to integer foreign key references Location(id),name varchar(100) unique,unique(id_from,id_to),check (id_from < id_to)
);
但是,您必须记住插入值以使用触发器来确保它们是有序的。
否则,您可以对最小值和最大值使用计算列,然后对其使用唯一约束。
,您可以使用 sum 和 product 计算列来强制执行无向边的唯一性:
create table Location (
id integer primary key(1,1),latitude decimal(8,6),longitude decimal(9,address varchar(100),name varchar(60) unique
);
create table Journey (
id integer primary key identity(1,s as id_from + id_to persisted,p as id_from * id_to persisted,unique(s,p),);
是为每对位置强制执行单次旅程(无论是进入还是返回)的正确方法。二次方程最多有两个解。它至少有 id_from 和 id_to。所以方程 xx - sx + p=0 总是正好有 2 个解,即 id_from 和 id_to。你可以在那里看到数学解释https://math.stackexchange.com/questions/171407/finding-two-numbers-given-their-sum-and-their-product