Flutter:如何将图像存储为 Sqlite 中的 blob 以及如何检索它?

问题描述 投票:0回答:2

我正在使用Flutter,我需要将SQLite中的图像保存为BLOB,然后将其显示在我的页面中。

我将其作为字符串进行,它工作正常,但不是 1.5 MB 大小的图像,应用程序出现异常,我尝试将其作为 blob 进行,但我在任何地方都找不到任何教程。

我的型号:

import 'package:flutter/services.dart';

const String tablePersonal = 'personal_info';

class PersonalFields {
  static final List<String> values = [
    id,
    name,
    logo,
  ];
  static const String id = '_id';
  static const String name = 'name';
  static const String logo = 'logo';
}

class PersonalInfoModel {
  int? id;
  final String name;
  final Uint8List? logo;

  PersonalInfoModel({
    this.id,
    required this.name,
    this.logo,
  });

  PersonalInfoModel copy({
    int? id,
    String? name,
    Uint8List? logo,
  }) =>
      PersonalInfoModel(
        id: id ?? this.id,
        name: name ?? this.name,
        logo: logo ?? this.logo,
      );

  static PersonalInfoModel fromJson(Map<String, Object?> json) =>
      PersonalInfoModel(
        id: json[PersonalFields.id] as int?,
        name: json[PersonalFields.name] as String,
        logo: json[PersonalFields.logo] as Uint8List?,
      );

  Map<String, dynamic> toJson() => {
        PersonalFields.id: id,
        PersonalFields.name: name,
        PersonalFields.logo: logo,
      };
}

SQL Helper:创建表后,我只需插入空记录来保存 id = 1,以便我只更新记录。这意味着该表只会获得一条记录。

batch.execute('''
      CREATE TABLE IF NOT EXISTS $tablePersonal
      (
        ${PersonalFields.id} $idType,
        ${PersonalFields.name} $textType,
        ${PersonalFields.logo} $blobType
      )
    ''');

    batch.execute('''
      INSERT INTO $tablePersonal
      (
        ${PersonalFields.name}
      )
      VALUES
      (
        ''
      )
    ''');

  //read personal info
  Future<List<PersonalInfoModel>> getPesonalInfo() async {
    var db = await instanace.database;
    final result = await db.query(tablePersonal);
    return result.map((json) => PersonalInfoModel.fromJson(json)).toList();
  }

  Future<int> updatePersonalInfo(PersonalInfoModel personalInfoModel) async {
    final db = await instanace.database;
    return db.update(
      tablePersonal,
      personalInfoModel.toJson(),
      where: '${PersonalFields.id} = ?',
      whereArgs: [personalInfoModel.id],
    );
  }

我的页面:

import 'dart:convert';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:image_picker/image_picker.dart';
import 'package:ledger/database/sql_helper.dart';
import 'package:ledger/l10n/app_local.dart';
import 'package:ledger/models/personal_info_model.dart';


class PersonalInfoPage extends StatefulWidget {
  const PersonalInfoPage({Key? key}) : super(key: key);

  @override
  State<PersonalInfoPage> createState() => _PersonalInfoPageState();
}

class _PersonalInfoPageState extends State<PersonalInfoPage> {
  final _formKey = GlobalKey<FormState>();
  final TextEditingController _nameController = TextEditingController();

  double boxWidth = 10;
  double boxHieght = 10;
  XFile? xImage;
  var bytes;
  final ImagePicker _picker = ImagePicker();
  late List<PersonalInfoModel> personalList;
  late PersonalInfoModel existPersonal;
  bool isLoading = true;

  @override
  void initState() {
    super.initState();

    getPersonalInfo();
  }

  Future pickImage() async {
    try {
      xImage = await _picker.pickImage(source: ImageSource.gallery);
      if (xImage == null) return;
      final imagePath = File(xImage!.path);
      bytes = imagePath;
      setState(() {});
    } on PlatformException catch (e) {
      print('Failed to pick image: $e');
    }
  }
  
  Future getPersonalInfo() async {
    final data = await SQLHelper.instanace.getPesonalInfo();
    setState(() {
      personalList = data;
      getData();

      isLoading = false;
    });
  }

  getData() {
    existPersonal = personalList.firstWhere((element) => element.id == 1);
    _nameController.text = existPersonal.name;
    bytes = existPersonal.logo;
  }


  Future updatePersonalInfo(PersonalInfoModel personalInfoModel) async {
    await SQLHelper.instanace.updatePersonalInfo(personalInfoModel);
    getPersonalInfo();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(AppLocal.loc.personal_info),
        actions: [
          IconButton(
            onPressed: () {
              PersonalInfoModel personalInfoModel = PersonalInfoModel(
                  id: 1,
                  name: _nameController.text,
                  logo: bytes);
              updatePersonalInfo(personalInfoModel);
            },
            icon: const Icon(Icons.save_as_outlined),
          ),
        ],
      ),
      body: isLoading
          ? const Center(child: CircularProgressIndicator())
          : SingleChildScrollView(
              child: Column(
                children: [
                  Padding(
                    padding: const EdgeInsets.symmetric(horizontal: 5.0),
                    child: Form(
                      key: _formKey,
                      child: Column(
                        children: [
                          SizedBox(height: boxHieght),
                          TextFormField(
                            controller: _nameController,
                            decoration: InputDecoration(
                              filled: true,
                              labelText: AppLocal.loc.name,
                              border: const OutlineInputBorder(
                                borderRadius: BorderRadius.all(
                                  Radius.circular(5.0),
                                ),
                              ),
                            ),
                          ),
                        ],
                      ),
                    ),
                  ),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      TextButton(
                        onPressed: () {
                          print('xxxxxx');
                          pickImage();
                        },
                        child: Text('from Gallary'),
                      ),
                    ],
                  ),
                  Container(
                    color: Colors.grey.shade100,
                    height: 150,
                    width: 150,
                    child: bytes != null
                        ? Image.memory(bytes)
                        : Image.asset('assets/logo.png'),
                  ),
                ],
              ),
            ),
    );
  }
}

flutter image sqlite dart blob
2个回答
1
投票

以下是如何将其转换为 blob 并将其保存到 SQLite


  Future pickImage(ImageSource source) async {
    try {
      final image = await ImagePicker.pickImage(source: source);

      final imagePath = File(image.path);

     
      List<int> bytes = await image.readAsBytes();
      String base64 = base64Encode(bytes);// here it is. Save it to sqflite
    } on PlatformException catch (e) {
      print(e);
    }
  }

用于从 SQLite 获取

   String blobImageFromSqflite; //get from sqflite
   Uint8List _bytesImage = Base64Decoder().convert(blobImageFromSqflite);

to display it;
                 Image.memory(
                 _bytesImage,
                 );

0
投票
  ///import 'package:image/image.dart' as Image1;


  // final bytes = await File(pickedFilePath).readAsBytes();
  // final pickedImage = Image1.decodeImage(bytes);
  // Uint8List imageBytes = 
  //Uint8List.fromList(Image1.encodeJpg(pickedImage));



   Future<Uint8List?> photo_dataByEntryID(BuildContext context,{required String imageId)
   {
          Uint8List? imageData = null;
          await db.query('image',columns: ['image'],where: 'id = ${imageId}').then((value) async {
          if(value.length > 0)
          {
                 Uint8List? imageDataProcess = value[0]['image'] as Uint8List?;
                 imageData =  imageDataProcess!;
          }
          }).onError((error, stackTrace)  async {
                 print(error.toString());
          });
          return imageData;
   }
© www.soinside.com 2019 - 2024. All rights reserved.