RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1300189
Accepted
Sergey
Sergey
Asked:2022-06-29 19:59:51 +0000 UTC2022-06-29 19:59:51 +0000 UTC 2022-06-29 19:59:51 +0000 UTC

在哪里放置一个函数来填充表中的数据?

  • 772

在哪里放置一个函数来填充表中的数据?函数定义

/*ФУНКЦИЯ ЗАПОЛНЯЕТ КОЛЛЕКЦИЮ ДАННЫМИ ИЗ ТАБЛИЦЫ*/
 Future<void> _funGetData() async {
  var list = await _database.rawQuery('SELECT * FROM Person');
  //заполняем коллекцию объектами
  _ara = List<Person>.from( list.map((e) => Person.fromMap(e)) );
 }

函数调用

//ГДЕ НУЖНО РАЗМЕСТИТЬ ЭТУ ФУНКЦИЮ ???
_funGetData();

在我的示例中,该函数位于数据库创建或初始化之后,检查之后。我应该在哪里正确放置???

if(_database.isOpen) {
   _funTableCreate(_tablePerson);
   //ГДЕ НУЖНО РАЗМЕСТИТЬ ЭТУ ФУНКЦИЮ ???
   _funGetData();
  }

在第一个选项中,当您非常快地启动应用程序时,会出现一个红色错误窗口。

在此处输入图像描述

在此处输入图像描述 然后出现表中的数据输出。一个非常简单的选择。

在此处输入图像描述

在此处输入图像描述 此外,1个简单变体的完整代码。 主要.dart

import 'package:flutter/material.dart';
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
import 'package:ext_storage/ext_storage.dart';

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

class MyApp extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
  return MaterialApp(
   debugShowCheckedModeBanner: false,
   title: 'Name App',
   theme: ThemeData(
    primarySwatch: Colors.blue,
   ),
   home: Scaffold(
    appBar: AppBar(
     title: Text('Name Page'),
    ),
    body: MyHomePage(),
   ),
  );
 }
}

class MyHomePage extends StatefulWidget {
 @override
 _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

 String _str1 = '';
 String _str2 = '';

 Database _database;
 String _databasesPath = '';
 String _databaseName = '';

 String _tablePerson = '''
  CREATE TABLE Person(
   id INTEGER NOT NULL,
   name TEXT NOT NULL,
   age INTEGER NOT NULL
  )
 ''';

 List<Person> _ara = [];

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

 }

 Future<void> _funDatabaseInit() async {
  //путь к расположению базы данных
  _databasesPath = await ExtStorage.getExternalStoragePublicDirectory(ExtStorage.DIRECTORY_DOWNLOADS);
  //имя базы данных
  _databaseName = 'abc.db';
  //соединение пути и имени
  String pathAll = join(_databasesPath, _databaseName);
  //создание или открытие базы
  _database = await openDatabase(pathAll);

  if(_database.isOpen) {
   _funTableCreate(_tablePerson);
   //ГДЕ НУЖНО РАЗМЕСТИТЬ ЭТУ ФУНКЦИЮ ???
   _funGetData();
  }

  setState(() {
   _str1 = '';
   _str2 = '';
   _str1 = '${_database.isOpen}';
   _str2 = _database.path;
  });

 }

 /**/
 Future<void> _funTableCreate(String table) async {
  await _database.execute(table);
 }

 /**/
 Future<void> _funTableInsert(String table, dynamic classModel) async {
  await _database.insert(
   table,
   classModel.toMap(),
   conflictAlgorithm: ConflictAlgorithm.replace
  );
 }

 /*ФУНКЦИЯ ЗАПОЛНЯЕТ КОЛЛЕКЦИЮ ДАННЫМИ ИЗ ТАБЛИЦЫ*/
 Future<void> _funGetData() async {
  var list = await _database.rawQuery('SELECT * FROM Person');
  //заполняем коллекцию объектами
  _ara = List<Person>.from( list.map((e) => Person.fromMap(e)) );
 }

 @override
 Widget build(BuildContext context) {
  return Column(
   children: [
    Padding(
     padding: const EdgeInsets.all(8.0),
     child: Row(
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      children: [
       OutlineButton(
        onPressed: () {
         setState(() {
          _funTableInsert(
           'Person',
           Person(id: 1, name: 'Ivan', age: 21)
          );
         });
        },
        child: Text(
         'Insert',
         style: TextStyle(
          fontSize: 20.0,
          color: Colors.deepPurple
         ),
        ),
       ),
      ],
     ),
    ),
    Padding(
     padding: const EdgeInsets.all(8.0),
     child: Row(
      children: [
       Text(
        'database is open : $_str1'
       ),
      ],
     ),
    ),
    Padding(
     padding: const EdgeInsets.all(8.0),
     child: Row(
      children: [
       Text(
        'path : $_str2'
       ),
      ],
     ),
    ),

    Padding(
     padding: const EdgeInsets.all(8.0),
     child: Row(
      children: [
       Text(
        '${_ara[0].id} ${_ara[0].name} ${_ara[0].age} ',
       ),
      ],
     ),
    ),

   ],
  );
 }

}

class Person {

 //название столбцов таблицы должно совпадать с названием полей
 final int id;
 final String name;
 final int age;

 Person({
  this.id,
  this.name,
  this.age
 });

 //для вставки данных в таблицу
 Map<String, dynamic> toMap() {
  return {
   'id': id,
   'name': name,
   'age': age,
  };
 }

 //для чтения данных из таблицы
 factory Person.fromMap(Map<String, dynamic> map) => Person(
  id: map['id'] as int,
  name: map['name'] as String,
  age: map['age'] as int
 );

}



在第二个变体中,任务稍微复杂一些。创建了一个小部件,条件是如果集合的长度为 0,则铭文 Hello World!,如果不等于0,则显示表格数据。Hello World 出现了一会儿!,也就是说,由于某种原因,数据尚未加载到集合中。

在此处输入图像描述
然后你好世界!消失,但什么也没有显示。数据应该已经加载。

在此处输入图像描述
函数应该放在哪里?下面是第二版
main.dart的完整代码

import 'package:flutter/material.dart';
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
import 'package:ext_storage/ext_storage.dart';

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

class MyApp extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
  return MaterialApp(
   debugShowCheckedModeBanner: false,
   title: 'Name App',
   theme: ThemeData(
    primarySwatch: Colors.blue,
   ),
   home: Scaffold(
    appBar: AppBar(
     title: Text('Name Page'),
    ),
    body: MyHomePage(),
   ),
  );
 }
}

class MyHomePage extends StatefulWidget {
 @override
 _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

 String _str1 = '';
 String _str2 = '';

 Database _database;
 String _databasesPath = '';
 String _databaseName = '';

 String _tablePerson = '''
  CREATE TABLE Person(
   id INTEGER NOT NULL,
   name TEXT NOT NULL,
   age INTEGER NOT NULL
  )
 ''';

 List<Person> _ara = [];

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

 }

 Future<void> _funDatabaseInit() async {
  //путь к расположению базы данных
  _databasesPath = await ExtStorage.getExternalStoragePublicDirectory(ExtStorage.DIRECTORY_DOWNLOADS);
  //имя базы данных
  _databaseName = 'abc.db';
  //соединение пути и имени
  String pathAll = join(_databasesPath, _databaseName);
  //создание или открытие базы
  _database = await openDatabase(pathAll);

  if(_database.isOpen) {
   _funTableCreate(_tablePerson);
   //ГДЕ НУЖНО РАЗМЕСТИТЬ ЭТУ ФУНКЦИЮ ???
   _funGetData();
  }

  setState(() {
   _str1 = '';
   _str2 = '';
   _str1 = '${_database.isOpen}';
   _str2 = _database.path;
  });

 }

 /**/
 Future<void> _funTableCreate(String table) async {
  await _database.execute(table);
 }

 /**/
 Future<void> _funTableInsert(String table, dynamic classModel) async {
  await _database.insert(
   table,
   classModel.toMap(),
   conflictAlgorithm: ConflictAlgorithm.replace
  );
 }

 /*ФУНКЦИЯ ЗАПОЛНЯЕТ КОЛЛЕКЦИЮ ДАННЫМИ ИЗ ТАБЛИЦЫ*/
 Future<void> _funGetData() async {
  var list = await _database.rawQuery('SELECT * FROM Person');
  //заполняем коллекцию объектами
  _ara = List<Person>.from( list.map((e) => Person.fromMap(e)) );
 }

 Widget _widgetW() {
  if(_ara.length == 0) {
   return Padding(
    padding: const EdgeInsets.all(8.0),
    child: Row(
     children: [
      Text(
       'Hello World!',
       style: TextStyle(
        fontSize: 24.0,
        color: Colors.pink,
       ),
      )
     ],
    ),
   );
  } else {
   return Padding(
    padding: const EdgeInsets.all(8.0),
    child: Row(
     children: [
      ListView.builder(
       itemCount: _ara.length,
       itemBuilder: (context, index) {
        return Text(
         '${_ara[index].id} ${_ara[index].name} ${_ara[index].age} ',
        );
       },
      ),
     ],
    ),
   );
  }
 }

 @override
 Widget build(BuildContext context) {
  return Column(
   children: [
    Padding(
     padding: const EdgeInsets.all(8.0),
     child: Row(
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      children: [
       OutlineButton(
        onPressed: () {
         setState(() {
          _funTableInsert(
           'Person',
           Person(id: 1, name: 'Ivan', age: 21)
          );
         });
        },
        child: Text(
         'Insert',
         style: TextStyle(
          fontSize: 20.0,
          color: Colors.deepPurple
         ),
        ),
       ),
      ],
     ),
    ),
    Padding(
     padding: const EdgeInsets.all(8.0),
     child: Row(
      children: [
       Text(
        'database is open : $_str1'
       ),
      ],
     ),
    ),
    Padding(
     padding: const EdgeInsets.all(8.0),
     child: Row(
      children: [
       Text(
        'path : $_str2'
       ),
      ],
     ),
    ),

    _widgetW(),

   ],
  );
 }

}

class Person {

 //название столбцов таблицы должно совпадать с названием полей
 final int id;
 final String name;
 final int age;

 Person({
  this.id,
  this.name,
  this.age
 });

 //для вставки данных в таблицу
 Map<String, dynamic> toMap() {
  return {
   'id': id,
   'name': name,
   'age': age,
  };
 }

 //для чтения данных из таблицы
 factory Person.fromMap(Map<String, dynamic> map) => Person(
  id: map['id'] as int,
  name: map['name'] as String,
  age: map['age'] as int
 );

}
sqlite
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Maxgmer
    2022-06-30T16:40:14Z2022-06-30T16:40:14Z

    这是您屏幕的完整工作版本: https ://pastebin.com/raw/VNNG99SV 。

    尝试这样做:

      if(_database.isOpen) {
        await _funTableCreate(_tablePerson);
        await _funGetData();
      }
    

    如果没有关键字await,则可能在_funGetData();方法创建表之前调用它_funTableCreate(_tablePerson);,这将导致错误。

    build()还可以通过更改将数据插入数据库的按钮并添加加载指示器来更正:

      @override
      Widget build(BuildContext context) {
        if (_screenLoading) {
          return Center(
            child: CupertinoActivityIndicator(
              radius: 24,
            ),
          );
        }
        return Column(
          children: [
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                children: [
                  OutlineButton(
                    onPressed: () =>_funTableInsert('Person', Person(id: 1, name: 'Ivan', age: 21)),
                    child: Text(
                      'Insert',
                      style: TextStyle(fontSize: 20.0, color: Colors.deepPurple),
                    ),
                  ),
                ],
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: Row(
                children: [
                  Text('database is open : $_str1'),
                ],
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: Row(
                children: [
                  Text('path : $_str2'),
                ],
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: Row(
                children: [
                  Text(
                    '${_ara[0].id} ${_ara[0].name} ${_ara[0].age} ',
                  ),
                ],
              ),
            ),
          ],
        );
      }
    

    调整_funTableInsert()以便在插入数据后始终更新屏幕状态:

      Future<void> _funTableInsert(String table, dynamic classModel) async {
        setState(() {
          _screenLoading = true;
        });
        await _database.insert(
            table,
            classModel.toMap(),
            conflictAlgorithm: ConflictAlgorithm.replace
        );
        setState(() {
          _screenLoading = false;
        });
      }
    

    将加载指示符添加到方法中_funDatabaseInit():

      Future<void> _funDatabaseInit() async {
        setState(() {
          _screenLoading = true;
        });
        //путь к расположению базы данных
        _databasesPath = await ExtStorage.getExternalStoragePublicDirectory(ExtStorage.DIRECTORY_DOWNLOADS);
        //имя базы данных
        _databaseName = 'abc.db';
        //соединение пути и имени
        String pathAll = join(_databasesPath, _databaseName);
        //создание или открытие базы
        _database = await openDatabase(pathAll);
    
        if(_database.isOpen) {
          await _funTableCreate(_tablePerson);
          await _funGetData();
        }
    
        setState(() {
          _str1 = '';
          _str2 = '';
          _str1 = '${_database.isOpen}';
          _str2 = _database.path;
          _screenLoading = false;
        });
      }
    

    并在屏幕上创建一个变量bool _screenLoading;。

    • 1

相关问题

  • 烧瓶:靠近“”:语法错误

  • 加密每个 sqlite 数据库条目的缺点是什么?

  • 多插入

  • SQLite 审计触发器

  • Qt SqlLite 对非空表进行正常 SELECT 查询后的空列表?

  • 为什么数据库表中的数据计算不正确?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5