Как я могу решить эту проблему? Flutter sqflite delete не работает - PullRequest
0 голосов
/ 12 июля 2020

Я новый Flutter, так что извиняюсь за свои ошибки. Я хочу удалить выбранный мной элемент списка, но не могу. Я инициализирую базу данных таким образом в главном дротике:

 Database db;
  Future createDatabase() async {
    db = await openDatabase(
     
      "listoftasks.db",
      version: 1, 
      onCreate: (Database db, int version) {
        db.execute(
            "CREATE TABLE Tasks (id INTEGER PRIMARY KEY, name TEXT)"); 
        print("creating");
      },
      onOpen: (Database db) {
        
        print("opened existing database");
      },
    );

    
  }

  @override
  void initState() {
    createDatabase();

    super.initState();
  }

, и я перешел на MainPage следующим образом:

@override
  Widget build(BuildContext context) {
    return Scaffold(
      resizeToAvoidBottomPadding: false,
      backgroundColor: const Color(0xfff9fcff),
      body: db == null ? Container() : MainPage(db),
    );
  }
}

, и здесь находится MainPage, я описал получение базы данных и рендеринг на страницу.

List<Task> existingTasks = []; 

  getTasks() async {
    existingTasks = [];

    List<Map> tasksQuery = 
        await widget.db.rawQuery(
           
            "SELECT * FROM Tasks"); 
    for (var i in tasksQuery) {
      
      String name = i["name"]; 
      id = i["id"];

      Task newTask = Task(id: id, title: name);

      setState(() {
        
        existingTasks.add(newTask); 

    
      });
    }
  }

  @override
  void initState() {
    getTasks();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Material(
      color: Color(0xffF9FCFF),
      child:  
         
              TaskPage(
                  tasks: existingTasks,
                  db: widget.db,
                  getTasks: getTasks,
                  id: id);

Моя проблема здесь, я вытаскиваю db и id для удаления на TaskPage, но у меня есть ошибка. Идентификатор является целым числом, и я написал целое число в кодах sql для удаления, но ошибка отображается. Я не понимаю почему. Я сожалею об этом. Пожалуйста, помогите мне . Кнопка удаления и TaskPage:

     IconButton(
                                    color: Colors.red,
                                    iconSize: 25,
                                    icon: Icon(Icons.delete),
                                    onPressed: () {
                                      widget.db.rawDelete(
                                          "DELETE FROM Tasks WHERE id = $widget.id  "); 
 //i am pulling id as selected value from MainPage but It doesn't work.
                                      print(widget.id); 
                                      widget.getTasks();
                                    }),

Ошибка:

E / SQLiteLog (3683): ​​(1) нет такого столбца: TaskPage.id E / flutter (3683): ​​[ОШИБКА: flutter / lib / ui / ui_dart_state. cc (166) ] Необработанное исключение: DatabaseException (такого столбца нет: TaskPage.id (код 1): при компиляции: УДАЛИТЬ ИЗ gorevler WHERE id = TaskPage.id) sql 'УДАЛИТЬ ИЗ gorevler WHERE id = TaskPage.id' args []}

Разве он не извлекал идентификатор из MainPage? Я не могу понять ошибку.

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Строковая интерполяция во Flutter достигается с помощью ${expression}. Если выражение является идентификатором, вы можете пропустить {}. В вашем случае выражение не является идентификатором, поэтому вы должны использовать фигурные скобки. Если вас это смущает, просто обязательно используйте фигурные скобки для всех случаев.

Вот как вы должны действовать:

"DELETE FROM Tasks WHERE id = ${widget.id}"

Ваш неправильный код в основном делает это:

"DELETE FROM Tasks WHERE id = ${widget}.id"

0 голосов
/ 13 июля 2020

Если это точный код, то я вижу некоторые ошибки в нем, например, тип данных 'id' не определен, а интерполяция строк должна выполняться с фигурными скобками, если нет. слов больше одного (например: $ {widget.id}). На самом деле эти битые фрагменты кода еще больше сбивают с толку. если возможно, загрузите полные файлы дротиков.

...