我想在显示任何页面之前检查本地数据库是否为空。
我在数据库帮助程序类中实现了一个代码:
Future checkDb() async{
var db = await getDatabasesPath();
var dbPath = join(db,"main.db");
bool exist = await databaseExists(dbPath);
return exist;
}
Future<Database> get db async{
if(_db!= null)
{
return _db;
}
_db = await initdb();
return _db;
}
initdb() async{
Directory documentDirectory = await getApplicationDocumentsDirectory();
String path = join(documentDirectory.path,"main.db");
var ourDb = await openDatabase(path,version:1,onCreate:_onCreate);
return ourDb;
}
void _onCreate(Database db,int version)async {
await db.execute("CREATE TABLE User("
"userId INTEGER PRIMARY KEY,"
"first_name TEXT,"
"last_name TEXT,"
"user_password TEXT,"
")");
print("User Table created");
}
//insertion of data
Future<int> saveUser(User user)async {
var dbClient = await db;
int res = await dbClient.insert("User", user.tMap());
return res;
}
如果返回false,我想浏览页面以登录页面。我在main.dart中实现了这一点:
Future<void> main()async(){
WidgetsFlutterBinding.ensureInitialized();
AcadFlip myApp;
if(db.checkDb() ){
myApp = AcadFlip(
initialRoute: '/SignIn');
}
return runApp(myApp);
}
class AcadFlip extends StatelessWidget {
final String initialRoute;
AcadFlip({this.initialRoute});
@override
Widget build(BuildContext context) {
return MaterialApp(
initialRoute:initialRoute,
routes: routes,
);
}
}
如何使功能checkdb()显示或返回布尔值而不是导航的Future<dynamic>
实例?
答案 0 :(得分:0)
请记住,db.checkDb()
是一个Future,因此如果要像if(await db.checkDb())
那样重写布尔值,则可以在内部使用它。也就是说,一个好的方法就是像这样更改它
Future<void> main()async(){
WidgetsFlutterBinding.ensureInitialized();
bool exist = await db.checkDb();
return runApp(AcadFlip(initialRoute: exist ? '/' : '/SignIn')); //or whatever your initial route is if it exists
}
这样,它将检查将来的值,此后,如果存在,则使用初始路由“ /”,如果不存在,则使用“ / SignIn”。使用之前的代码,if永远不会运行,因为它想要一个布尔值,即使您使用await,它也只会在其为true时才输入,否则AcadFlip myApp
将永远不会初始化,并且您将尝试运行空对象{{ 1}}
更新
您的initdb方法使用runApp(null)
,而checkDb使用Directory documentDirectory = await getApplicationDocumentsDirectory();
,因此您正在使用其他路径来检查数据库是否存在。
await getDatabasesPath();
或者您可以在checkDb和initdb中使用getDatabasesPath,唯一要记住的是在两者中使用相同的路径,因此逻辑可以工作
Future checkDb() async{
Directory documentDirectory = await getApplicationDocumentsDirectory() //use the same path as initdb
var dbPath = join(documentDirectory.path,"main.db");
bool exist = await databaseExists(dbPath);
return exist;
}
是getDatabasesPath
的功能,它根据使用的平台(Android或IOS)返回用于创建数据库的默认路径。 sqflite
是getApplicationDocumentsDirectory
的路径,但不会返回与getDatabasesPath