Как сохранить полученные данные из нескольких текстовых полей в базе данных SQLite и отобразить эти данные на 3 экранах в flutter?

#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){...}
  );
}
  

Дайте мне знать, если это решит вашу проблему, и если я правильно понял ваш вопрос. 🙂