Флаттер: Как использовать данные, хранящиеся в SQFlite? - PullRequest
0 голосов
/ 03 мая 2020

Я действительно борюсь с Флаттером и SQFlite. Существует множество сложных примеров, но нет ни одного простого примера для получения данных и помещения их в переменную для использования в виджете или модели. Я пробовал кучу примеров, и большинство из них выдают ошибку «таблица не существует». Я наконец нашел пример, который сработал, и попытался использовать его для своих нужд, но я просто потерян. Я новичок ie, чтобы трепетать, но не кодировать. Занимался веб-кодированием годами. Я потратил часы на то, чтобы просто заставить работать простой запрос и вернуть его содержимое в переменную. Я действительно рассматриваю возможность полностью отказаться от Flutter только из-за того, как трудно обрабатывать хранимые данные. Это должны быть базовые вещи. Почему это так тяжело !?

В любом случае, вот мой код, чтобы вы могли увидеть, чего я пытаюсь достичь. Я могу создать базу данных, вставить и получить данные внутри класса DBHelper, но я понятия не имею, как использовать эти данные вне его. Моя цель - заставить работать простой пример, а затем я смогу реализовать его в более широком масштабе для всего моего приложения. У меня разного рода динамические списки c и т.д. c. Любая помощь будет высоко ценится!

database.dart

import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

class DBNoteModel {
  String id;
  String value;

  DBNoteModel({this.id, this.value});

  Map<String, dynamic> toMap() {
    final map = new Map<String, dynamic>();
    map["id"] = id;
    map["value"] = value;
    return map;
  }

  //to be used when converting the row into object
  factory DBNoteModel.fromMap(Map<String, dynamic> data) =>
      new DBNoteModel(id: data['id'], value: data['value']);
}

class DBHelper {
  Database db;

  DBHelper() {
    initDatabase();
  }

  Future<void> initDatabase() async {
    db = await openDatabase(join(await getDatabasesPath(), "database.db"),
        onCreate: (db, version) {
      return db.execute('''
        CREATE TABLE notes(id TEXT PRIMARY KEY, value TEXT);
        INSERT INTO notes (id, value) VALUES ('home', 'asd');
        ''');
    }, version: 1);
  }

  Future<void> updateNote(String id, String value) async {
    db.rawUpdate("UPDATE notes SET value = '$value' WHERE id = $id");
  }

  getNote(String id) async {
    List<Map> result = await db.rawQuery("SELECT * FROM notes WHERE id = $id");
    if (result.length > 0) {
      return DBNoteModel.fromMap(result[0]);
    }
    return null;
  }
}

test.dart

import 'package:flutter/material.dart';
import '../../utilities/database.dart';

class TestScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final DBHelper _dbHelper = DBHelper();
    var note = _dbHelper.getNote('home');
    return Text(note.value);
  }
}

1 Ответ

0 голосов
/ 07 мая 2020

если у вас более одной записи данных, вам нужна List<DBNoteModel> вашей модели данных. В этом примере он показывает с Listview

в вашей команде onCreate базы данных, для каждой команды требуется отдельный execute, такой как

onCreate: (db, version) async {
  await db.execute("CREATE TABLE notes(id TEXT PRIMARY KEY, value TEXT)");
  await db.execute("INSERT INTO notes (id, value) VALUES ('home', 'asd')");
  await db.execute("INSERT INTO notes (id, value) VALUES ('home2', 'asddf')");
},

DBHelper

class DBHelper {

  Database _db;

  Future<Database> get db async {
    if (_db != null) {
      return _db;
    }
    _db = await initDatabase();

    return _db;
  }


  initDatabase() async {
    return await openDatabase(join(await getDatabasesPath(), "database.db"),
      onCreate: (db, version) async {
        await db.execute("CREATE TABLE notes(id TEXT PRIMARY KEY, value TEXT)");
        await db.execute("INSERT INTO notes (id, value) VALUES ('home', 'asd')");
        await db.execute("INSERT INTO notes (id, value) VALUES ('home2', 'asddf')");
      },
      version: 1);

  }

  Future<void> updateNote({DBNoteModel dbnoteupdate}) async {

    _db.update("notes", dbnoteupdate.toMap(), where: 'id = ?', whereArgs: [dbnoteupdate.id]);

  }

  Future<void> insertNote({DBNoteModel dbnoteupdate}) async {

    _db.insert("notes", dbnoteupdate.toMap());

  }

  Future<List<DBNoteModel>> selectNote(String value) async {

    _db = await db;
    List<Map> result;

    if(value == "")
      result = await _db.query("notes");
    else {
      result = await _db.query("notes", where: "value LIKE '" + value + "%'");
    }

    List<DBNoteModel> r_DBNoteModel = result.map((i) => DBNoteModel.fromMap(i)).toList();

    return r_DBNoteModel;

  }

}

показать некоторые данные в ListView, на вкладке => update, при изменении текстового поля => выбрать Like? *, На FloatingButton => insert

class sqFliteSimpleExample extends StatefulWidget {
  @override
  _sqFliteSimpleExampleState createState() => _sqFliteSimpleExampleState();
}

class _sqFliteSimpleExampleState extends State<sqFliteSimpleExample> {

  List<DBNoteModel> dbnotes = new List();

  final DBHelper _dbHelper = DBHelper();

  TextEditingController editingController = new TextEditingController();

  @override
  void initState() {
    //fetch Notes for the firstTime
    getNotes("");
    super.initState();
  }

  getNotes(String where) {
    // Select with a where or without
    _dbHelper.selectNote(where).then((value) {
      // return value is a List<DBNoteModel>
      setState(() {
        // refresh screen with the new values
        dbnotes = value;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(title: new Text("SqFilte Notes"),),
      body: new Column(
        crossAxisAlignment: CrossAxisAlignment.stretch,
        mainAxisSize: MainAxisSize.max,
        children: <Widget>[
          new Expanded(
            child: new ListView.builder(
              itemCount: dbnotes.length,
              itemBuilder: (BuildContext context, index) {
                return new ListTile(
                  title: Text(dbnotes[index].id.toString()),
                  subtitle: Text(dbnotes[index].value),
                  onTap: () {
                    // updates you local Datamodel
                    dbnotes[index].value = dbnotes[index].value + " update";
                    // send sql Update
                    _dbHelper.updateNote(dbnoteupdate: dbnotes[index]).then((value) {
                      // refresh when it's done
                      getNotes("");
                    });
                  },
                );
              },
            ),
          ),
          new Padding(
            padding: const EdgeInsets.all(15.0),
            child: new TextField(
              controller: editingController,
              onChanged: (value) => getNotes(value), // refresh the screen every string input in the TextField
              decoration: InputDecoration(
                hintText: 'search / create',
                border: InputBorder.none,
              ),
            ),
          ),
        ],
      ),
      floatingActionButton: new FloatingActionButton(
        child: Icon(Icons.add),
        onPressed: () {
          //insert a new Note, and refresh when it's done
          _dbHelper.insertNote(dbnoteupdate: new DBNoteModel(id: editingController.text, value: editingController.text)).then((value) {
            getNotes("");
          });
        }
      ),
    );
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...