Je souhaite récupérer des données d'image dans sqlite. im en utilisant le code ci-dessous
var image = await ImagePicker.pickImage(source: imageSource); List<int> bytes = await image.readAsBytes();
je veux prendre une image et après l'avoir sauvegardée sqlite.if peut obtenir et définir l'image à partir de la base de données sqlite?.
3 Réponses :
import 'dart:convert'; import 'dart:typed_data'; Â Â Â Â Uint8List bytesImage1; Â Â Â Â bool bolWithImage1 = false; Â Â Â Â try { Â Â Â Â Â Â bytesImage1 = Â Â Â Â Â Â Â Â Â Â base64Decode(base64StringFromSql); Â Â Â Â Â Â bolWithImage1 = true; Â Â Â Â } catch (err) {} i.e. if bolWithImage1 is true, the conversion is successful. You can then use image.memory(byteImage1, ......) to show the image in flutter.
J'ai trouvé la solution dans ma question. J'obtiens l'image d'un image_picker et l'encode en valeur de chaîne BASE64 comme ci-dessous
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) ), ); } ); } } ),
après avoir créé un fichier de base de données SQLite dbhelper.dart
pour récupérer les valeurs de chaîne et fichier de modèle de base de données Image.dart
pour obtenir et définir les valeurs de chaîne.
image.dart
Future<List<Employee>> fetchImageFromDatabase() async { var dbHelper = DBHelper(); Future<List<Imagedata>> images= dbHelper.getImages(); return images; }
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; } }
dernière valeur de chaîne obtenue de la base de données et valeur de chaîne de décodage dans le fichier image.
Récupération d'image de la base de données
class Image{ int id; String image; Employee(this.id, this.image); Employee.fromMap(Map map) { id= map[id]; image = map[image]; } }
après Décoder la valeur de la chaîne dans le fichier image
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; }); }
Je pense que cela est utile pour les autres développeurs de flutter, sqlite
Vous pouvez également enregistrer l'image en tant que BLOB (type de données: UInt8List). Le stockage à la fois en tant que Blob (UInt8List) ou String (avec Base64encoder) dans sqflite fonctionne. La clé était d'utiliser MemoryImage au lieu de Image.memory. Sinon, vous obtiendrez le type 'Image' n'est pas un sous-type d'erreur de 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], ), ]);
J'ai changé l'image en base64 String et l'ai enregistrée dans SQL, faites-moi savoir si vous avez trouvé une meilleure solution.
c'est bon. si vous avez une méthode utile pour récupérer l'image en utilisant un base64? peut m'envoyer votre code source?
pls. attendez, j'utilise un téléphone portable!