How to save image data to sqflite database in flutter for persistence

前端 未结 2 693
囚心锁ツ
囚心锁ツ 2021-02-19 22:43

I\'m building a Flutter app where I would like to keep the data offline.

I\'m capturing an image using the camera or gallery image picker and able to store that image i

2条回答
  •  名媛妹妹
    2021-02-19 22:56

    Images and, in general, files, are meant to be stored as BLOB in a SQLite database.

    To do so:

    1. We should create a Picture class:
    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 toMap() => {
       "id": id,
       "title": title,
       "picture" : picture,
     };
    }
    
    1. We can then create our table accordingly:
    await db.execute("CREATE TABLE Picture(id INTEGER PRIMARY KEY, title TEXT, picture BLOB )");
    
    1. Create a method to save the Picture in the DB:
    void savePicture(Picture picture) async {
      var dbClient = await db;
      await dbClient.insert("Picture", picture.toMap());
    }
    
    1. Create a method to get the Pictures from the DB:
    Future> getPictures() async {
        var dbClient = await db;
        List list = await dbClient.rawQuery('SELECT * FROM Picture');
        List 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. Save a Picture to the DB:
    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. Use it when needed, for example:
    Image.memory(picture.picture);
    

    NB: While in the example above we used an Image, this concept applies well with any other kinds of files.

    Converting a file to base64 and store it as a string works, but it's not the best solution. One issue is an increase of the storage requirements by 33%, that adds up quickly especially when dealing with large files.

提交回复
热议问题