#android #sqlite #flutter
#Android #sqlite #flutter
Вопрос:
В моем приложении flutter есть форма, в которой есть 5 текстовых полей (в которых 2 строки и 3 целых числа) и кнопка «отправить». Я хочу сохранить эти данные в своей базе данных SQLite и хочу отобразить эти данные на 3 экранах. Пожалуйста, помогите мне.
Пожалуйста, проверьте код базы данных ниже. Некоторые методы еще предстоит добавить, но они будут добавлены позже.
Просто для пояснения — это будет приложение для Android
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
import 'models/account_summary_db.dart';
class DatabaseHelper {
DatabaseHelper() {
database();
}
Future<Database> database() async {
return openDatabase(
join(await getDatabasesPath(), 'acc_summary_db.db'),
onCreate: (db, version) {
// Run the CREATE TABLE statement on the database.
return db.execute(
"CREATE TABLE accounts(accountSummaryCardId INTEGER PRIMARY KEY, name TEXT, totalAmount INTEGER, pendingAmount INTEGER, phoneNo INTEGER, place TEXT)",
);
},
version: 1,
);
}
Future<int> insertACC(AccountSummary accountSummary) async {
int _accountSummaryCardId = 0;
Database _db = await database();
await _db
.insert('accounts', accountSummary.toMap(),
conflictAlgorithm: ConflictAlgorithm.replace)
.then((value) {
_accountSummaryCardId = value;
});
return _accountSummaryCardId;
}
Future<List<AccountSummary>> getAccounts() async {
Database _db = await database();
List<Map<String, dynamic>> accountMap = await _db.query('accounts');
return List.generate(
accountMap.length,
(index) => AccountSummary(
accountSummaryCardId: accountMap[index]['accountSummaryCardId'],
name: accountMap[index]['name'],
totalAmount: accountMap[index]['totalAmount'],
pendingAmount: accountMap[index]['pendingAmount'],
phoneNo: accountMap[index]['phoneNo'],
place: accountMap[index]['place']),
);
}
Future<void> updateName(int accountSummaryCardId, String name) async {
Database _db = await database();
await _db.rawUpdate(
"UPDATE accounts SET name = '$name' WHERE accountSummaryCardId = '$accountSummaryCardId'");
}
}
Ответ №1:
Похоже, у вас есть управляемая сторона SQLite, но я бы посоветовал вам использовать пакет управления состоянием, такой как Provider, для уменьшения запросов к данным, поскольку вы будете использовать эти данные на нескольких экранах. Ниже приведен пример:
@override
Widget build(BuildContext context){
return MultiProvider(
providers:[
//Simply add your database queries in here
FutureProvider.value(YOUR_DATABASE_QUERY)
]
child:MaterialApp(...)
);
}
В качестве альтернативы вы можете использовать FutureBuilder:
@override
Widget build(BuildContext context){
return FutureBuilder(
future: YOUR_DATABASE_QUERY,
builder: (context,snapshot){...}
);
}
Дайте мне знать, если это решит вашу проблему, и если я правильно понял ваш вопрос. 🙂