Images 和一般情况下的文件应以BLOB 的形式存储在SQLite 数据库中。
这样做:
- 我们应该创建一个
Picture 类:
class Picture {
final int id;
final String title;
final Uint8List picture;
Picture({this.id, this.title, this.picture});
Picture.fromMap(Map map) {
id = map[id];
title = map[title];
picture = map[picture];
}
Map<String, dynamic> toMap() => {
"id": id,
"title": title,
"picture" : picture,
};
}
- 然后我们可以相应地创建我们的表:
await db.execute("CREATE TABLE Picture(id INTEGER PRIMARY KEY, title TEXT, picture BLOB )");
- 创建将
Picture 保存在数据库中的方法:
void savePicture(Picture picture) async {
var dbClient = await db;
await dbClient.insert("Picture", picture.toMap());
}
- 创建一个从数据库中获取
Pictures 的方法:
Future<List<Picture>> getPictures() async {
var dbClient = await db;
List<Map> list = await dbClient.rawQuery('SELECT * FROM Picture');
List<Picture> pictures = new List();
for (int i = 0; i < list.length; i++) {
pictures.add(new Picture(list[i]["id"], list[i]["text"], list[i]["picture"]));
}
return pictures;
}
}
- 将
Picture 保存到数据库:
var image = await get(
"https://images.pexels.com/photos/2047905/pexels-photo-2047905.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940");
var bytes = image.bodyBytes;
Picture picture = Picture(id, title, picture);
savePicture(picture);
- 在需要时使用它,例如:
Image.memory(picture.picture);
注意:虽然在上面的示例中我们使用了Image,但这个概念也适用于任何其他类型的文件。
将文件转换为base64 并将其存储为字符串有效,但it's not the best solution。一个问题是存储需求增加了 33%,尤其是在处理大文件时。