在显示任何页面之前检查数据库是否存在

时间:2020-06-26 04:46:50

标签: flutter

我想在显示任何页面之前检查本地数据库是否为空。

我在数据库帮助程序类中实现了一个代码:

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>实例?

1 个答案:

答案 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)返回用于创建数据库的默认路径。 sqflitegetApplicationDocumentsDirectory的路径,但不会返回与getDatabasesPath

相同的路径