Flutter 为什么在我刷新页面之前,object addedItem的Id始终返回1
我想得到对象的真实Id,我如何在不关闭页面的情况下实时创建并返回到它 因为我使用initState()从数据库中获取数据,如果我试图在不这样做的情况下获取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
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}