How to save image data to sqflite database in flutter for persistence
Image
s and, in general, files, are meant to be stored as BLOB
in a SQLite
database.
To do so:
- 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<String, dynamic> toMap() => { "id": id, "title": title, "picture" : picture, };}
- We can then create our table accordingly:
await db.execute("CREATE TABLE Picture(id INTEGER PRIMARY KEY, title TEXT, picture BLOB )");
- 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());}
- Create a method to get the
Picture
s from the DB:
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; }}
- 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);
- 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.