· 4 years ago · Jun 30, 2021, 12:22 PM
1import 'package:flutter/material.dart';
2import 'package:path/path.dart';
3import 'package:sqflite/sqflite.dart';
4import 'package:ext_storage/ext_storage.dart';
5
6void main() => runApp(MyApp());
7
8class MyApp extends StatelessWidget {
9 @override
10 Widget build(BuildContext context) {
11 return MaterialApp(
12 debugShowCheckedModeBanner: false,
13 title: 'Name App',
14 theme: ThemeData(
15 primarySwatch: Colors.blue,
16 ),
17 home: Scaffold(
18 appBar: AppBar(
19 title: Text('Name Page'),
20 ),
21 body: MyHomePage(),
22 ),
23 );
24 }
25}
26
27class MyHomePage extends StatefulWidget {
28 @override
29 _MyHomePageState createState() => _MyHomePageState();
30}
31
32class _MyHomePageState extends State<MyHomePage> {
33 bool _isLoading;
34
35 String _str1 = '';
36 String _str2 = '';
37
38 Database _database;
39 String _databasesPath = '';
40 String _databaseName = '';
41
42 String _tablePerson = '''
43 CREATE TABLE Person(
44 id INTEGER NOT NULL,
45 name TEXT NOT NULL,
46 age INTEGER NOT NULL
47 )
48 ''';
49
50 List<Person> _ara = [];
51
52 @override
53 void initState() {
54 super.initState();
55 _funDatabaseInit();
56 }
57
58 Future<void> _funDatabaseInit() async {
59 _showLoading(loading: true);
60 //путь к расположению базы данных
61 _databasesPath =
62 await ExtStorage.getExternalStoragePublicDirectory(ExtStorage.DIRECTORY_DOWNLOADS);
63 //имя базы данных
64 _databaseName = 'abc.db';
65 //соединение пути и имени
66 String pathAll = join(_databasesPath, _databaseName);
67 //создание или открытие базы
68 _database = await openDatabase(pathAll);
69
70 if (_database.isOpen) {
71 await _funTableCreate(_tablePerson);
72 await _funGetData();
73 }
74
75 setState(() {
76 _str1 = '';
77 _str2 = '';
78 _str1 = '${_database.isOpen}';
79 _str2 = _database.path;
80 });
81 _showLoading(loading: false);
82 }
83
84 Future<void> _funTableCreate(String table) async {
85 try {
86 await _database.execute(table);
87 } catch (e) {
88 debugPrint('Error occured. Probably DB already exists, error: $e');
89 }
90 }
91
92 Future<void> _funTableInsert(String table, dynamic classModel) async {
93 await _database.insert(table, classModel.toMap(), conflictAlgorithm: ConflictAlgorithm.replace);
94 setState(() {});
95 }
96
97 /*ФУНКЦИЯ ЗАПОЛНЯЕТ КОЛЛЕКЦИЮ ДАННЫМИ ИЗ ТАБЛИЦЫ*/
98 Future<List<Person>> _funGetData() async {
99 var list = await _database.rawQuery('SELECT * FROM Person');
100 //заполняем коллекцию объектами
101 return List<Person>.from(list.map((e) => Person.fromMap(e)));
102 }
103
104 @override
105 Widget build(BuildContext context) {
106 if (_isLoading) {
107 return Center(
108 child: CircularProgressIndicator(),
109 );
110 }
111 return Column(
112 children: [
113 Padding(
114 padding: const EdgeInsets.all(8.0),
115 child: Row(
116 mainAxisAlignment: MainAxisAlignment.spaceEvenly,
117 children: [
118 OutlineButton(
119 onPressed: () => _funTableInsert('Person', Person(id: 1, name: 'Ivan', age: 21)),
120 child: Text(
121 'Insert',
122 style: TextStyle(fontSize: 20.0, color: Colors.deepPurple),
123 ),
124 ),
125 ],
126 ),
127 ),
128 Padding(
129 padding: const EdgeInsets.all(8.0),
130 child: Row(
131 children: [
132 Text('database is open : $_str1'),
133 ],
134 ),
135 ),
136 Padding(
137 padding: const EdgeInsets.all(8.0),
138 child: Row(
139 children: [
140 Text('path : $_str2'),
141 ],
142 ),
143 ),
144 Expanded(
145 child: Padding(
146 padding: const EdgeInsets.all(8.0),
147 child: FutureBuilder<List<Person>>(
148 future: _funGetData(),
149 builder: (context, snapshot) {
150 if (snapshot.hasData) {
151 //return Text('Данные есть!!!');
152
153 /*Но, если я их пытаюсь вывести, они не выводятся*/
154
155 return ListView.builder(
156 itemCount: snapshot.data.length,
157 itemBuilder: (context, index) => Text(
158 '${snapshot.data[index].id} ${snapshot.data[index].name} ${snapshot.data[index].age}',
159 ),
160 );
161 } else if (snapshot.hasError) {
162 return Text("${snapshot.error}");
163 } else {
164 return Center(
165 child: CircularProgressIndicator(),
166 );
167 }
168 },
169 ),
170 ),
171 ),
172 ],
173 );
174 }
175
176 void _showLoading({@required bool loading}) {
177 setState(() {
178 _isLoading = loading;
179 });
180 }
181}
182
183class Person {
184 //название столбцов таблицы должно совпадать с названием полей
185 final int id;
186 final String name;
187 final int age;
188
189 Person({this.id, this.name, this.age});
190
191 //для вставки данных в таблицу
192 Map<String, dynamic> toMap() {
193 return {
194 'id': id,
195 'name': name,
196 'age': age,
197 };
198 }
199
200 //для чтения данных из таблицы
201 factory Person.fromMap(Map<String, dynamic> map) =>
202 Person(id: map['id'] as int, name: map['name'] as String, age: map['age'] as int);
203}
204