Flutter 我如何在Flatter中解码和查看本地数据库中的BLOB?

Flutter 我如何在Flatter中解码和查看本地数据库中的BLOB?,flutter,dart,Flutter,Dart,我有一个SQLite数据库,它有一个包含blob的列 我试图访问并显示这个BLOB,但可惜没有成功 以下是我尝试过的: Image.memory(Uint8List.view(myList[counterInt]['ItemImageBLOB'])), 我也试过了 Image.memory(Uint8List(myList[counterInt]['ItemImageBLOB'])), 我收到的错误是: type '_Uint8ArrayView' is not a subtype of t

我有一个SQLite数据库,它有一个包含blob的列

我试图访问并显示这个BLOB,但可惜没有成功

以下是我尝试过的:

Image.memory(Uint8List.view(myList[counterInt]['ItemImageBLOB'])),
我也试过了

Image.memory(Uint8List(myList[counterInt]['ItemImageBLOB'])),
我收到的错误是:

type '_Uint8ArrayView' is not a subtype of type 'ByteBuffer'

如果您也遵循下面的案例
直接使用以下内容

Image.memory(myList[counteInt]['ItemImageBLOB']) 
在我的示例中,我硬编码并将其保存到sqlite BLOB字段

显示图片

Image.memory(snapshot.data[index].pict)
创建sqlite表时,字段类型必须为BLOB

await db.execute(
    "CREATE TABLE Employee(id INTEGER PRIMARY KEY, firstname TEXT, lastname TEXT, mobileno TEXT,emailId TEXT, pict BLOB )");
在您的类中,pict字段必须是Uint8List类型

班级员工{

  String firstName;
  String lastName;
  String mobileNo;
  String emailId;
  Uint8List pict;

  Employee(this.firstName, this.lastName,this.mobileNo,this.emailId, this.pict);

   Employee.fromMap(Map map) {
    firstName = map[firstName];
    lastName = map[lastName];
    mobileNo = map[mobileNo];
    emailId = map[emailId];
    pict = map[pict];
  }

  Map<String, dynamic> toMap() => {
    "firstName": firstName,
    "lastName": lastName,
    "mobileNo" : mobileNo,
    "emailId" : emailId,
    "pict": pict,
  };

}
stringfirstname;
字符串lastName;
字符串mobileNo;
字符串emailId;
Uint8List pict;
员工(this.firstName、this.lastName、this.mobileNo、this.emailId、this.pict);
Employee.fromMap(地图地图){
firstName=map[firstName];
lastName=map[lastName];
mobileNo=地图[mobileNo];
emailId=map[emailId];
pict=地图[pict];
}
映射toMap()=>{
“名字”:名字,
“lastName”:lastName,
“mobileNo”:mobileNo,
“emailId”:emailId,
“pict”:pict,
};
}
演示执行

完整工作代码

主飞镖

import 'package:flutter/material.dart';
import 'package:so_sqlite/database/dbhelper.dart';
import 'package:so_sqlite/model/employee.dart';
import 'package:so_sqlite/employeelist.dart';
import 'package:http/http.dart' show get;

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'SQFLite DataBase Demo',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  Employee employee = new Employee("", "", "", "", null);

  String firstname;
  String lastname;
  String emailId;
  String mobileno;
  final scaffoldKey = new GlobalKey<ScaffoldState>();
  final formKey = new GlobalKey<FormState>();

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      key: scaffoldKey,
      appBar: new AppBar(title: new Text('Saving Employee'), actions: <Widget>[
        new IconButton(
          icon: const Icon(Icons.view_list),
          tooltip: 'Next choice',
          onPressed: () {
            navigateToEmployeeList();
          },
        ),
      ]),
      body: SingleChildScrollView(
        child: new Padding(
          padding: const EdgeInsets.all(16.0),
          child: new Form(
            key: formKey,
            child: new Column(
              children: [
                new TextFormField(
                  keyboardType: TextInputType.text,
                  decoration: new InputDecoration(labelText: 'First Name'),
                  validator: (val) => val.length == 0 ? "Enter FirstName" : null,
                  onSaved: (val) => this.firstname = val,
                ),
                new TextFormField(
                  keyboardType: TextInputType.text,
                  decoration: new InputDecoration(labelText: 'Last Name'),
                  validator: (val) => val.length == 0 ? 'Enter LastName' : null,
                  onSaved: (val) => this.lastname = val,
                ),
                new TextFormField(
                  keyboardType: TextInputType.phone,
                  decoration: new InputDecoration(labelText: 'Mobile No'),
                  validator: (val) => val.length == 0 ? 'Enter Mobile No' : null,
                  onSaved: (val) => this.mobileno = val,
                ),
                new TextFormField(
                  keyboardType: TextInputType.emailAddress,
                  decoration: new InputDecoration(labelText: 'Email Id'),
                  validator: (val) => val.length == 0 ? 'Enter Email Id' : null,
                  onSaved: (val) => this.emailId = val,
                ),
                new Container(
                  margin: const EdgeInsets.only(top: 10.0),
                  child: new RaisedButton(
                    onPressed: _submit,
                    child: new Text('Save'),
                  ),
                )
              ],
            ),
          ),
        ),
      ),
    );
  }

  void _submit() async {
    if (this.formKey.currentState.validate()) {
      formKey.currentState.save();
    } else {
      return null;
    }

    var response = await get(
        "https://upload.wikimedia.org/wikipedia/commons/7/70/Example.png");
    var bytesFromPict = response.bodyBytes;

    print("bytes : ${bytesFromPict}");

    var employee =
        Employee(firstname, lastname, mobileno, emailId, bytesFromPict);
    var dbHelper = DBHelper();
    dbHelper.saveEmployee(employee);
    _showSnackBar("Data saved successfully");
  }

  void _showSnackBar(String text) {
    scaffoldKey.currentState
        .showSnackBar(new SnackBar(content: new Text(text)));
  }

  void navigateToEmployeeList() {
    Navigator.push(
      context,
      new MaterialPageRoute(builder: (context) => new MyEmployeeList()),
    );
  }
}
导入“包装:颤振/材料.省道”;
导入“package:so_sqlite/database/dbhelper.dart”;
导入“package:so_sqlite/model/employee.dart”;
导入“package:so_sqlite/employeelist.dart”;
导入“package:http/http.dart”show-get;
void main()=>runApp(新的MyApp());
类MyApp扩展了无状态小部件{
//此小部件是应用程序的根。
@凌驾
小部件构建(构建上下文){
返回新材料PP(
标题:“SQFLite数据库演示”,
主题:新主题数据(
主样本:颜色。蓝色,
),
主页:新MyHomePage(标题:“颤振演示主页”),
);
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>new_MyHomePageState();
}
类_MyHomePageState扩展状态{
员工=新员工(“,”,“,”,空);
字符串名;
字符串lastname;
字符串emailId;
字符串mobileno;
最终脚手架键=新的GlobalKey();
final formKey=new GlobalKey();
@凌驾
小部件构建(构建上下文){
归还新脚手架(
钥匙:脚手架钥匙,
appBar:new appBar(标题:新建文本(“保存员工”),操作:[
新图标按钮(
图标:常量图标(图标。查看列表),
工具提示:“下一个选项”,
已按下:(){
navigateToEmployeeList();
},
),
]),
正文:SingleChildScrollView(
孩子:新的填充物(
填充:常数边集全部(16.0),
儿童:新表格(
key:formKey,
子:新列(
儿童:[
新TextFormField(
键盘类型:TextInputType.text,
装饰:新输入装饰(labelText:“名字”),
验证程序:(val)=>val.length==0?“输入FirstName”:null,
onSaved:(val)=>this.firstname=val,
),
新TextFormField(
键盘类型:TextInputType.text,
装饰:新输入装饰(labelText:“姓氏”),
验证程序:(val)=>val.length==0?“输入LastName”:null,
onSaved:(val)=>this.lastname=val,
),
新TextFormField(
键盘类型:TextInputType.phone,
装饰:新输入装饰(labelText:“手机号”),
验证程序:(val)=>val.length==0?“输入手机号码”:null,
onSaved:(val)=>this.mobileno=val,
),
新TextFormField(
键盘类型:TextInputType.emailAddress,
装饰:新输入装饰(标签文本:“电子邮件Id”),
验证程序:(val)=>val.length==0?“输入电子邮件Id”:null,
onSaved:(val)=>this.emailId=val,
),
新容器(
边距:仅限常量边集(顶部:10.0),
孩子:新升起的按钮(
按下按钮:_提交,
子项:新文本(“保存”),
),
)
],
),
),
),
),
);
}
void\u submit()异步{
if(this.formKey.currentState.validate()){
formKey.currentState.save();
}否则{
返回null;
}
var response=等待获取(
"https://upload.wikimedia.org/wikipedia/commons/7/70/Example.png");
var bytesFromPict=response.bodyBytes;
打印(“字节:${bytesFromPict}”);
var雇员=
员工(名字、姓氏、mobileno、emailId、bytesFromPict);
var dbHelper=dbHelper();
dbHelper.saveEmployee(employee);
_showSnackBar(“数据保存成功”);
}
void\u showSnackBar(字符串文本){
scaffoldKey.currentState
.showSnackBar(新SnackBar(内容:新文本(Text)));
}
无效navigateToEmployeeList(){
导航器。推(
上下文
new MaterialPage路由(生成器:(上下文)=>new MyEmployeeList()),
);
}
}
雇员名单

import 'package:flutter/material.dart';
import 'package:so_sqlite/model/employee.dart';
import 'dart:async';
import 'package:so_sqlite/database/dbhelper.dart';

Future<List<Employee>> fetchEmployeesFromDatabase() async {
  var dbHelper = DBHelper();
  Future<List<Employee>> employees = dbHelper.getEmployees();
  return employees;
}

class MyEmployeeList extends StatefulWidget {
  @override
  MyEmployeeListPageState createState() => new MyEmployeeListPageState();
}

class MyEmployeeListPageState extends State<MyEmployeeList> {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('Employee List'),
      ),
      body: new Container(
        padding: new EdgeInsets.all(16.0),
        child: new FutureBuilder<List<Employee>>(
          future: fetchEmployeesFromDatabase(),
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              return new ListView.builder(
                  itemCount: snapshot.data.length,
                  itemBuilder: (context, index) {
                    return new Column(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: <Widget>[
                          new Text(snapshot.data[index].firstName,
                              style: new TextStyle(
                                  fontWeight: FontWeight.bold, fontSize: 18.0)),
                          new Text(snapshot.data[index].lastName,
                              style: new TextStyle(
                                  fontWeight: FontWeight.bold, fontSize: 14.0)),
                          Image.memory(snapshot.data[index].pict),
                          new Divider()
                        ]);
                  });
            } else if (snapshot.hasError) {
              return new Text("${snapshot.error}");
            }
            return new Container(alignment: AlignmentDirectional.center,child: new CircularProgressIndicator(),);
          },
        ),
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
导入“package:so_sqlite/model/employee.dart”;
导入“dart:async”;
导入“package:so_sqlite/database/dbhelper.dart”;
Future fetchEmployeesFromDatabase()异步{
var dbHelper=dbHelper();
Future employees=dbHelper.getEmployees();
返回员工;
}
类MyEmployeeList扩展StatefulWidget{
@凌驾
MyEmployeeListPageState createState()=>新建MyEmployeeListPageState();
}
类MyEmployeeListPageState扩展了状态{
@凌驾
小部件构建(构建上下文){
归还新脚手架(
appBar:新的appBar(
标题:新文本(“员工名单”),
),
B
import 'dart:math';
import 'dart:typed_data';

class Employee{

  String firstName;
  String lastName;
  String mobileNo;
  String emailId;
  Uint8List pict;

  Employee(this.firstName, this.lastName,this.mobileNo,this.emailId, this.pict);

   Employee.fromMap(Map map) {
    firstName = map[firstName];
    lastName = map[lastName];
    mobileNo = map[mobileNo];
    emailId = map[emailId];
    pict = map[pict];
  }

  Map<String, dynamic> toMap() => {
    "firstName": firstName,
    "lastName": lastName,
    "mobileNo" : mobileNo,
    "emailId" : emailId,
    "pict": pict,
  };

}
import 'dart:async';
import 'dart:io' as io;
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path_provider/path_provider.dart';
import 'package:so_sqlite/model/employee.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, "test1.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 Employee(id INTEGER PRIMARY KEY, firstname TEXT, lastname TEXT, mobileno TEXT,emailId TEXT, pict BLOB )");
    print("Created tables");
  }

  void saveEmployee(Employee employee) async {
    var dbClient = await db;
    await dbClient.insert("Employee", employee.toMap());
    /*await dbClient.transaction((txn) async {
      return await txn.rawInsert(
          'INSERT INTO Employee(firstname, lastname, mobileno, emailid, pict ) VALUES(' +
              '\'' +
              employee.firstName +
              '\'' +
              ',' +
              '\'' +
              employee.lastName +
              '\'' +
              ',' +
              '\'' +
              employee.mobileNo +
              '\'' +
              ',' +
              '\'' +
              employee.emailId +
              '\'' +
              employee.pict +
              '\'' +
              ')');
    });*/
  }

  Future<List<Employee>> getEmployees() async {
    var dbClient = await db;
    List<Map> list = await dbClient.rawQuery('SELECT * FROM Employee');
    List<Employee> employees = new List();
    for (int i = 0; i < list.length; i++) {
      employees.add(new Employee(list[i]["firstname"], list[i]["lastname"], list[i]["mobileno"], list[i]["emailid"], list[i]["pict"]));
    }
    print(employees.length);
    return employees;
  }
}