请帮助我。有一个数据库,里面有几个表。
(1) 诗的作者姓名.(2) 诗的名字。
一个表与另一个表之间用ID连接(在诗名表中有一列作者ID)。
需要通过点击作者诗打开这个作者的诗。我不知道如何建立这种连接。
Authors.dart (作者的模型)
Authors authorsFromJson(String str) {
final jsonData = json.decode(str);
return Authors.fromMap(jsonData);
}
String authorsToJson(Authors data) {
final dyn = data.toMap();
return json.encode(dyn);
}
class Authors {
int id;
String name;
int count;
Authors({
this.id,
this.name,
this.count,
});
factory Authors.fromMap(Map<String, dynamic> json) => new Authors(
id: json["c_id"],
name: json["c_title"],
count: json["c_i_count"],
);
Map<String, dynamic> toMap() => {
"c_id": id,
"c_title": name,
"c_i_count": count,
};
}
PoemsTitle.dart (诗题的模型)
PoemsTitle poemsTitleFromJson(String str) {
final jsonData = json.decode(str);
return PoemsTitle.fromMap(jsonData);
}
String poemsTitleToJson(PoemsTitle data) {
final dyn = data.toMap();
return json.encode(dyn);
}
class PoemsTitle {
int id;
String title;
int authorsId;
PoemsTitle({
this.id,
this.title,
this.authorsId,
});
factory PoemsTitle.fromMap(Map<String, dynamic> json) => new PoemsTitle(
id: json["ii_i_id"],
title: json["ii_i_title"],
authorsId: json["ii_col_int_2"],
);
Map<String, dynamic> toMap() => {
"ii_i_id": id,
"ii_i_title": title,
"ii_col_int_2": authorsId,
};
}
专栏 c_title 来自 种类 表必须与列 ii_col_int_2 来自 项目信息 表。
来自DBProvider的方法。
...Future<List<Authors>> getAllAuthors() async {
final db = await database;
var res = await db.query('category');
List<Authors> list = res.map((c) => Authors.fromMap(c)).toList();
return list;
}
Future<List<PoemsTitle>> getAllPoemsTitle() async {
final db = await database;
var res = await db.query('items_info');
List<PoemsTitle> list = res.map((c) => PoemsTitle.fromMap(c)).toList();
return list;
}
以及来自FutureBuilder和ListView. builder的页面:
这是一个Widget,点击相应的作者后,就会显示诗词。
class FavoriteTab extends StatelessWidget {
int authorId;
int count;
FavoriteTab({this.authorId, this.count});
@override
Widget build(BuildContext context) {
return Scaffold(
body: Padding(
padding: const EdgeInsets.only(left: 10, right: 10, bottom: 10),
child: Container(
padding: EdgeInsets.all(5),
decoration: BoxDecoration(
color: Theme.of(context).accentColor,
borderRadius: BorderRadius.all(Radius.circular(30))
),
child: FutureBuilder<List<PoemsTitle>>(
future: DBProvider.db.getAllPoemsTitle(),
builder: (context, snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.waiting:
return Center(
child: CircularProgressIndicator(),
);
case ConnectionState.done:
{
if (snapshot.hasError) {
return Center(
child: Text(snapshot.error.toString()),
);
} else if (snapshot.hasData) {
return Scrollbar(
child: ListView.builder(
physics: BouncingScrollPhysics(),
itemCount: this.count,
itemBuilder: (context, index) {
PoemsTitle item = snapshot.data[index];
return ListTile(
title: Text(item.title),
leading: Icon(Icons.receipt),
trailing: Icon(Icons.favorite, color: Colors.red, size: 34),
onTap: () {
},
);
},
)
);
}
return Center(
child: Text('No Data')
);
}
default:
return Container();
}
},
)
),
),
);
}
}
这是一个有作者的小部件
class MainTab extends StatefulWidget {
@override
_MainTabState createState() => _MainTabState();
}
class _MainTabState extends State<MainTab> {
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.only(left: 10, right: 10, bottom: 10),
child: Container(
padding: EdgeInsets.all(5),
decoration: BoxDecoration(
color: Theme.of(context).accentColor,
borderRadius: BorderRadius.all(Radius.circular(30))
),
child: FutureBuilder<List<Authors>>(
future: DBProvider.db.getAllAuthors(),
builder: (context, snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.waiting:
return Center(
child: CircularProgressIndicator(),
);
case ConnectionState.done:
{
if (snapshot.hasError) {
return Center(
child: Text(snapshot.error.toString()),
);
} else if (snapshot.hasData) {
return Scrollbar(
child: ListView.builder(
physics: BouncingScrollPhysics(),
itemCount: snapshot.data.length,
itemBuilder: (context, index) {
Authors item = snapshot.data[index];
return ListTile(
title: Text(item.name),
leading: Icon(Icons.folder),
trailing: Text(item.count.toString()),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => FavoriteTab(authorId: item.id, count: item.count)
)
);
},
);
},
)
);
}
return Center(
child: Text('No Data')
);
}
default:
return Container();
}
},
)
),
);
}
}
我认为问题出在这一行,在 FavoriteTab
小工具。
future: DBProvider.db.getAllPoemsTitle(),
在这里你可以随时查询所有的诗。正确的做法是创建一个像 getPoemOfAuthor(int authorID)
在 DBProvider
既然你通过了 authorId
当你打开你的 FavoriteTab
,在 FutureBuilder
你一定要打电话。
future: DBProvider.db.getPoemOfAuthor(authorId),
希望能帮到你!