【问题标题】:How to save image data to sqflite database in flutter for persistence如何在flutter中将图像数据保存到sqflite数据库以进行持久化
【发布时间】:2019-02-09 18:03:57
【问题描述】:

我正在构建一个 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 中的数据库中?这方面的最佳做法是什么?

【问题讨论】:

    标签: database sqlite dart flutter


    【解决方案1】:

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

    【讨论】:

    • 谢谢!这就是我一直在寻找的。​​span>
    • 如果我们想保存任何其他文件,如 pdf、excel 等。我们应该遵循同样的方式吗? @丹尼尔
    【解决方案2】:

    Images 和一般情况下的文件应以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. 创建一个从数据库中获取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;
      }
    }
    
    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%,尤其是在处理大文件时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-06
      • 1970-01-01
      • 1970-01-01
      • 2019-02-25
      • 1970-01-01
      • 1970-01-01
      • 2020-04-13
      • 2015-08-19
      相关资源
      最近更新 更多