【问题标题】:How to retreive image data in sqlite database in flutter?如何在flutter中检索sqlite数据库中的图像数据?
【发布时间】:2019-08-25 17:34:59
【问题描述】:

我想在 sqlite 中检索图像数据。我使用下面的代码

var image = await ImagePicker.pickImage(source: imageSource);
List<int> bytes = await image.readAsBytes();

我想拍摄图像并保存后 sqlite.if 可以从 sqlite 数据库获取和设置图像?.

【问题讨论】:

  • 我把图片改成base64字符串并保存在sql中,如果你找到更好的解决方案,请告诉我。
  • 没问题。如果您有任何有用的方法来使用 base64 检索图像?可以发给我你的源代码吗?
  • 请。等等,我在用手机!

标签: image sqlite flutter camera


【解决方案1】:

您还可以将图像保存为 BLOB(数据类型:UInt8List)。在 sqflite 中同时存储为 Blob(UInt8List)或字符串(使用 Base64encoder)。关键是使用 MemoryImage 而不是 Image.memory。否则你会得到 type 'Image' is not a subtype of type 'ImageProvider' 错误。

//First create column in database to store as BLOB.
await db.execute('CREATE TABLE $photoTable($colId INTEGER PRIMARY KEY AUTOINCREMENT, $colmage BLOB)');

//User imagePicker to get the image
File imageFile = await ImagePicker.pickImage(source: ImageSource.camera, maxHeight: 200, maxWidth: 200, imageQuality: 70);

//Get the file in UInt8List format
Uint8List imageInBytes = imageFile.readAsBytesSync();

//write the bytes to the database as a blob
db.rawUpdate('UPDATE $photoTable SET $colImage = ?, WHERE $colId =?', [imageInBytes, colID]);

//retrieve from database as a Blob of UInt8List 
var result = await db.query(photoTable, orderBy: '$colID ASC');
List<Photo> photoList = List<Photo>();

for (int i=0; i<result.length; i++){
  photoList.add(Photo.fromMapObject(userMapList[i]));
}

//Map function inside Photo object
Photo.fromMapObject(Map<String, dynamic> map) {
  this._id = map['id'];
  this._imageFile = map['image'];
}


//Display the image using using MemoryImage (returns ImagePicker Object) instead of Image.memory (returns an Image object). 
return Row(
  mainAxisAlignment: MainAxisAlignment.center,
  children: <Widget>[
     CircleAvatar(
        backgroundImage:  MemoryImage(Photo.image),
        backgroundColor: Colors.blueGrey[50],
      ),
   ]);

【讨论】:

    【解决方案2】:

    我在我的问题中找到了解决方案。 我从 image_picker 获取图像并将其编码为 BASE64 字符串值,如下所示

     Uint8List _bytesImage;   
     File _image;
     String  base64Image;
    
    Future getImage() async {
         var image2 = await ImagePicker.pickImage(
          source: ImageSource.gallery,
    
          );
        List<int> imageBytes = image2.readAsBytesSync();
        print(imageBytes);
        base64Image = base64Encode(imageBytes);
        print('string is');
        print(base64Image);
        print("You selected gallery image : " + image2.path);
    
        _bytesImage = Base64Decoder().convert(base64Image);
    
        setState(() {
    
          _image=image2;
    
          });
    }
    

    在创建 SQLite 数据库 dbhelper.dart 文件以检索字符串值和数据库模型文件 Image.dart 用于获取和设置字符串值之后。

    image.dart

    class Image{
    
      int id;
      String image;
    
    
      Employee(this.id, this.image);
    
       Employee.fromMap(Map map) {
        id= map[id];
        image = map[image];
    
      }
    
    }
    

    dbhelper.dart

     class DBHelper {
      static Database _db;
    
      Future<Database> get db async {
        if (_db != null) return _db;
        _db = await initDb();
        return _db;
      }
    
      initDb() async {
        io.Directory documentsDirectory = await getApplicationDocumentsDirectory();
        String path = join(documentsDirectory.path, "test.db");
        var theDb = await openDatabase(path, version: 1, onCreate: _onCreate);
        return theDb;
      }
    
      void _onCreate(Database db, int version) async {
        // When creating the db, create the table
        await db.execute(
            "CREATE TABLE Imagedata(id INTEGER PRIMARY KEY, image TEXT)");
        print("Created tables");
      }
    
      void saveImage(Imagedata imagedata) async {
        var dbClient = await db;
        await dbClient.transaction((txn) async {
          return await txn.rawInsert(
              'INSERT INTO Imagedata(id, image) VALUES(' +
                  '\'' +
                  imagedata.id+
                  '\'' +
                  ',' +
                  '\'' +
                  imagedata.image +
                  '\'' +
                  ')');
        });
      }
    
      Future<List<Imagedata>> getMyImage() async {
        var dbClient = await db;
        List<Map> list = await dbClient.rawQuery('SELECT * FROM Imagedata');
        List<Imagedata> images= new List();
        for (int i = 0; i < list.length; i++) {
          images.add(new Imagedata(list[i]["id"], list[i]["image"]));
        }
        print(images.length);
        return images;
      }
    
       Future<int> deleteMyImage(Imagedata imagedata) async {
        var dbClient = await db;
    
        int res =
            await dbClient.rawDelete('DELETE * FROM Imagedata');
        return res;
      }
    }
    

    上次从数据库中获取字符串值并将字符串值解码到图像文件中。

    从数据库中获取图片

          Future<List<Employee>> fetchImageFromDatabase() async {
             var dbHelper = DBHelper();
             Future<List<Imagedata>> images= dbHelper.getImages();
    
                     return images;
                }
    

    将字符串值解码到图像文件后

        String DecoImage;
        Uint8List _bytesImage;
    
              FutureBuilder<List<Imagedata>>(
              future: fetchImageFromDatabase(),
              builder: (context, snapshot) {
    
                 if (snapshot.hasData) {             
                  return new
                   ListView.builder(
                      itemCount: snapshot.data.length,
                      itemBuilder: (context, index) {
    
                          DecoImage=snapshot.data[index].image;
                         _bytesImage = Base64Decoder().convert(DecoImage);
    
                        return new   SingleChildScrollView(
                          child:  Container(            
                       child: _bytesImage == null 
                          ? new Text('No image value.')
                          :  Image.memory(_bytesImage)
                         ),
                        );
                       }
                     );
                    }
                  }
               ), 
    

    我认为这对其他 Flutter、sqlite 开发人员很有帮助

    【讨论】:

      【解决方案3】:
      import 'dart:convert';
      
      import 'dart:typed_data';
      
      
      
          Uint8List bytesImage1;
      
          bool bolWithImage1 = false;
      
          try {
      
            bytesImage1 =
      
                base64Decode(base64StringFromSql);
      
            bolWithImage1 = true;
      
          } catch (err) {}
      
      

      即如果 bolWithImage1 为真,则转换成功。然后,您可以使用 image.memory(byteImage1, ......) 以颤动的方式显示图像。

      【讨论】:

        猜你喜欢
        • 2023-03-03
        • 1970-01-01
        • 2011-09-24
        • 1970-01-01
        • 1970-01-01
        • 2011-05-10
        • 2018-11-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多