отмечать избранные элементы в списке в автономной базе данных не работает - PullRequest
0 голосов
/ 28 сентября 2019

Я все еще новичок в трепетании.Я работаю над приложением, в котором есть автономная база данных.Я показываю данные из базы данных в виде списка.в ListTile есть кнопка избранного, которая должна изменить значок и обновить избранный столбец базы данных с 1 или 0 на указанном идентификаторе элемента в зависимости от того, что было раньше.

В моей реализации это меняет значок для всехэлементы списка, но он обновляет столбец базы данных, но изменение значка не работает.

class NamesScreen extends StatefulWidget {
  final String gender, alphabet;

  NamesScreen(this.gender, this.alphabet);

  @override
  _NamesScreenState createState() => _NamesScreenState(gender, alphabet);
}

class _NamesScreenState extends State<NamesScreen> {
  final String gender, alphabet;

  bool fav = false;
  IconData iconData = Icons.favorite_border;

  _NamesScreenState(this.gender, this.alphabet);

  DatabaseHelper databaseHelper = DatabaseHelper();
  List<Name> namesList;
  int count = 0;

  @override
  void initState() {
    namesList = List<Name>();
    getNames(gender, alphabet);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Baby Names")),
      body: ListView.builder(
        itemCount: namesList.length,
        itemBuilder: (BuildContext ctx, int index) {
          return getNameTile(namesList[index]);
        },
      ),
    );
  }

  Widget getNameTile(Name name) {
    checkFav(context, name);

    return Column(
      children: <Widget>[
        ListTile(
          leading: Image.asset('assets/boy.png'),
          subtitle: Text(name.meaning),
          title: Text(name.name),
          trailing: Row(
            mainAxisAlignment: MainAxisAlignment.center,
            mainAxisSize: MainAxisSize.min,
            children: <Widget>[
              InkWell(
                child: Icon(
                  iconData,
                  color: Colors.red,
                ),
                onTap: () {
                  setState(() {
                    _onClickFav(context, name);
                    if (fav) {
                      iconData = Icons.favorite;
                    } else {
                      iconData = Icons.favorite_border;
                    }
                  });
                },
              ),
              Icon(Icons.share)
            ],
          ),
        ),
        Container(
          height: 1.0,
          color: Colors.grey,
        )
      ],
    );
  }

  Future _onClickFav(BuildContext context, Name name) async {
    final exists = await databaseHelper.exists(name);

    if (exists) {
      databaseHelper.update(name.id, 0);
      fav = false;
    } else {
      databaseHelper.update(name.id, 1);
      fav = true;
    }
  }

  Future checkFav(BuildContext context, Name name) async {
    final exists = await databaseHelper.exists(name);

    if (exists) {
      fav = false;
      iconData = Icons.favorite_border;
    } else {
      fav = true;
      iconData = Icons.favorite;
    }
  }

  void getNames(String gen, String ch) {
    final Future<Database> dbFuture = databaseHelper.initDatabase();
    dbFuture.then((database) {
      Future<List<Name>> nameListFuture = databaseHelper.getNames(gen, ch);
      nameListFuture.then((namesL) {
        setState(() {
          this.namesList = namesL;
          this.count = namesL.length;
        });
      });
    });
  }
}

Код DatabaseHelper

 update(int id, int value) async {
    Database db = await this.database;
    return await db
        .rawQuery('UPDATE $factsTable SET fav = $value WHERE id = $id');
  }

  bool fav = false;

  Future<Name> getName(int id) async {
    var dbClient = await database;

    final result = await dbClient.rawQuery(
        'SELECT * FROM $factsTable WHERE ${Constants.colId} = $id AND ${Constants.colFav} = 1');

    if (result.length > 0) {
      return new Name.fromMapObject(result.first);
    }

    return null;
  }

  Future<bool> exists(Name name) async {
    Name n = await getName(name.id);
    var exists = n != null;
    return exists;
  }

Я тестировал этот код с локальным списком избранных элементов, он работает таким образом, но не с базой данных.

1 Ответ

0 голосов
/ 30 сентября 2019

измените команду rawQuery на команду rawUpdate
фрагмент кода

update(int id, int value) async {
    Database db = await this.database;
    return await db
        .rawUpdate('UPDATE $factsTable SET fav = $value WHERE id = $id');
  }

официальный пример из https://pub.dev/packages/sqflite

// Update some record
int count = await database.rawUpdate(
    'UPDATE Test SET name = ?, VALUE = ? WHERE name = ?',
    ['updated name', '9876', 'some name']);
print('updated: $count');
...