Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 为什么在我刷新页面之前,object addedItem的Id始终返回1_Flutter_Dart - Fatal编程技术网

Flutter 为什么在我刷新页面之前,object addedItem的Id始终返回1

Flutter 为什么在我刷新页面之前,object addedItem的Id始终返回1,flutter,dart,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 ad

我想得到对象的真实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();
  }
}
导入'dart:async';
导入“包:sqflite/sqflite.dart”;
导入“dart:io”;
导入“package:path/path.dart”;
导入“package:path_provider/path_provider.dart”;
导入“包:mblists/models/movies.dart”;
类数据库助手{
最终字符串moviesTable=“moviesTable”;
最后一个字符串idColumn=“id”;
最终字符串name column=“name”;
最终字符串descriptionColumn=“description”;
最终字符串rateColumn=“rate”;
静态最终DatabaseHelper _实例=DatabaseHelper.internal();
factory DatabaseHelper()=>\u实例;
静态数据库;
未来获取数据库异步{
如果(_db!=null){
返回_db;
}
_db=等待initDb();
返回_db;
}
DatabaseHelper.internal();
initDb()异步{
目录fileDirectory=等待getApplicationDocumentsDirectory();
stringpath=join(fileDirectory.path,“maindabase.db”);
var maindb=await openDatabase(路径,版本:1,onCreate:_onCreate);
返回maindb;
}
void\u onCreate(数据库数据库数据库,int新版本)异步{
等待db.execute(
“创建表$moviesTable($idColumn INTEGER主键,$nameColumn文本,$descriptionColumn文本,$rateColumn文本)”);
}
Future saveMovie(电影)异步{
var dbClient=await db;
int res=await dbClient.insert(“$moviesTable”,movie.toMap());
返回res;
}
未来的getAllMovies()异步{
var dbClient=await db;
var result=await dbClient.rawQuery(“从$moviesTable中选择*);
返回结果;
}
未来getMovie(int id)异步{
var dbClient=await db;
var result=await dbClient.rawQuery(“从$moviesTable中选择*其中$id=$id”);
如果(result.length==0){
返回null;
}
返回Movie.formMap(result.first);
}
Future getCount()异步{
var dbCllient=await db;
返回Sqflite.firstIntValue(
wait dbCllient.rawQuery(“从$moviesTable中选择COUNT(*))
);
}
未来删除电影(int-id)异步{
var dbClient=await db;
return wait dbClient.delete(moviesTable,其中:“$idColumn=?”,其中rgs:[id]);
}
未来的deleteMovies()异步{
var dbClient=await db;
return wait dbClient.delete(moviesTable);
}
Future updateMovie(电影)异步{
var dbClient=await db;
return wait dbClient.update(moviesTable,movie.toMap(),
其中:“$idColumn=?”,其中rgs:[movie.id]
);
}
Future colse()异步{
var dbClient=await db;
返回wait-dbClient.close();
}
}

Insert方法返回正确的新id,但您在
getMovie
中有一个输入错误:

var result=await dbClient.rawQuery(“从$moviesTable中选择*其中$id=$id”);
WHERE条件应包含列名,但has id=id条件(始终为true),然后它接受第一个元素(始终为同一个)。通过传递id列的名称来修复它:

var result=await dbClient.rawQuery(“从$moviesTable中选择*其中$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}