flutter - 为什么对象addItem的ID始终返回1,直到刷新页面

标签 flutter dart

我想获取对象的真实ID如何在没有关闭页面的情况下实时创建并返回到它
因为我使用 initState()从数据库获取数据,并且如果我尝试不这样做就获取ID,它将返回1;
有人知道为什么会这样,谁来解决?

这是我的功能:

item(String name,String desc,int rate) async{
    int savedItem = await db.saveMovie(Movie(name, desc,rate.toString()));
    Movie addedItem = await db.getMovie(savedItem);
    setState(() {
      movies.add(addedItem);
    });
    print("Item id :${addedItem.id} Saved item : ${savedItem}");
  }

这是我的数据库帮助程序代码:
import 'dart:async';
import 'package:sqflite/sqflite.dart';
import 'dart:io';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:mblists/models/movies.dart';
class DatabaseHelper {

  final String moviesTable = "moviesTable";
  final String idColumn = "id";
  final String nameColumn = "name";
  final String descriptionColumn = "description";
  final String rateColumn = "rate";

  static final DatabaseHelper _instance = DatabaseHelper.internal();
  factory DatabaseHelper() => _instance;
  static Database _db;

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

  DatabaseHelper.internal();
  initDb() async{
    Directory fileDirectory = await getApplicationDocumentsDirectory();
    String path = join(fileDirectory.path,"maindatabase.db");
    var maindb = await openDatabase(path,version: 1,onCreate: _onCreate);
    return maindb;
  }
  void _onCreate(Database db,int newVersion) async{
    await db.execute(
      "CREATE TABLE $moviesTable($idColumn INTEGER PRIMARY KEY, $nameColumn TEXT, $descriptionColumn TEXT, $rateColumn TEXT)");
  }

  Future<int> saveMovie(Movie movie) async{
    var dbClient = await db;
    int res = await dbClient.insert("$moviesTable", movie.toMap());
    return res;
  }

  Future<List> getAllMovies() async{
    var dbClient = await db;
    var result = await dbClient.rawQuery("SELECT * FROM $moviesTable");
    return result;
  }
  Future<Movie> getMovie(int id) async{
    var dbClient = await db;
    var result = await dbClient.rawQuery("SELECT * FROM $moviesTable WHERE $id = $id");
    if(result.length == 0) {
      return null;
    }
    return Movie.formMap(result.first);
  }
  Future<int> getCount() async {
    var dbCllient = await db;
    return Sqflite.firstIntValue(
      await dbCllient.rawQuery("SELECT COUNT(*) FROM $moviesTable")
    );
  }

  Future<int> deleteMovie(int id) async {
    var dbClient = await db;
    return await dbClient.delete(moviesTable,where: "$idColumn = ?",whereArgs: [ id]);
  }
  Future<int> deleteMovies() async {
    var dbClient = await db;
    return await dbClient.delete(moviesTable);
  }
  Future<int> updateMovie(Movie movie) async {
    var dbClient = await db;
    return await dbClient.update(moviesTable,movie.toMap(),
    where: "$idColumn = ?" , whereArgs: [movie.id]
    );
  }

  Future colse() async{
    var dbClient = await db;
    return await dbClient.close();
  }
}

最佳答案

Insert方法返回正确的新ID,但是getMovie中有一个错字:

var result = await dbClient.rawQuery("SELECT * FROM $moviesTable WHERE $id = $id");

WHERE条件应该包含列名,但是您具有id = id条件(始终为true),然后它采用第一个元素(始终相同)。通过传递id列的名称来修复它:

var result = await dbClient.rawQuery("SELECT * FROM $moviesTable WHERE $idColumn = $id");

它的工作原理是:
I/flutter ( 5996): Item id :13 Saved item : {id: 13, name: test, description: desc, rate: 1}
I/flutter ( 5996): Item id :14 Saved item : {id: 14, name: test, description: desc, rate: 1}
I/flutter ( 5996): Item id :15 Saved item : {id: 15, name: test, description: desc, rate: 1}

关于flutter - 为什么对象addItem的ID始终返回1,直到刷新页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59090314/

相关文章:

firebase - 从Firestore获取数据

dart - Dart 中关于类成员的封装和类型注释的约定是什么?

firebase - Flutter 上传一批图像并获取所有这些 URL 以存储在 Firestore 中

encryption - 如何加密字符串并在其他设备中解密这个加密的字符串?

dart - Flutter:通过 Google Firebase 授权时出错

firebase - Flutter Firebase 实时数据库一次写入/更新到多个节点

dart - 如何使用angular2_material Dart

flutter - Flutter 中有 'BroadcastReciver' 吗?

dart - Flutter:密码自动填充

dart - flutter : How to calculate value from textfields in listview.构建器