dart 如何在Flutter中将图像数据保存到sqflite数据库中以实现持久化

ie3xauqp  于 2023-06-27  发布在  Flutter
关注(0)|答案(2)|浏览(117)

我正在构建一个Flutter应用程序,我想在其中保持数据离线。
我正在使用相机或图库图像拾取器捕获图像,并能够将该图像存储到File image变量中。

File _avatarImg;

void _getImage(BuildContext context, ImageSource source) {
    ImagePicker.pickImage(
      source: source,
      maxWidth: 400.0,
      maxHeight: 400.0,
    ).then((File image) {
      _avatarImg = image;
    });
  }

这工作得很好,但我的问题是,我如何去存储这个图像的持久性?我是否应该在图像所在的手机中存储指向本地媒体目录的字符串链接?如果是这样的话,我会担心图像是否被用户意外删除。还是将图像本身以BLOB的形式存储到数据库中?这方面的最佳做法是什么?

mefy6pfw

mefy6pfw1#

您可以将图像转换为BASE64并将图像作为字符串存储在数据库中。检查this linkthis one

jyztefdp

jyztefdp2#

Image s和一般的文件都是作为BLOB存储在SQLite数据库中的。
为此:
1.我们应该创建一个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,
 };
}

1.然后我们可以相应地创建表格:

await db.execute("CREATE TABLE Picture(id INTEGER PRIMARY KEY, title TEXT, picture BLOB )");

1.创建一个方法将Picture保存到数据库中:

void savePicture(Picture picture) async {
  var dbClient = await db;
  await dbClient.insert("Picture", picture.toMap());
}

1.创建一个方法从数据库中获取Picture s:

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;
  }
}

1.将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);

1.在需要时使用它,例如:

Image.memory(picture.picture);

注意:虽然在上面的示例中我们使用了Image,但这个概念适用于任何其他类型的文件。
将文件转换为base64并将其存储为字符串可以工作,但it's not the best solution。一个问题是存储需求增加了33%,特别是在处理大文件时,这一需求增加得很快。

相关问题