如何从 Workmanager 中的任务访问 SQLite 数据库?

问题描述 投票:0回答:1

我正在尝试执行定期后台任务来上传一些信息,我需要的信息位于本地 sqlite 数据库中,但我无法像在 Workmanager 任务中那样访问它,它给了我一条消息,表明数据库未初始化。

这是回调调度程序

@pragma('vm:entry-point')
void callbackDispatcher() {
  Workmanager().executeTask((task, inputData) {
    // Your background task logic goes here
    debugPrint("TASK: {$task}");
    debugPrint(DateTime.now().toString());

    switch (task) {
      case finishEvaluationTask:
        ScheduledTask.control();
        break;
      case periodicEvaluationTask:
        debugPrint("Hello from periodic Evaluation");
        ScheduledTask.control();
        break;
      default:
        debugPrint("Hello from switch case default");
    }
    // Inform back that background task run successfully
    return Future.value(true);
  });
}

   

这是我使用的功能的一部分,这是我的经理不起作用的地方,但当我在 Workmanager 之外使用它时它确实起作用

class ScheduledTask {
  static Future<void> control() async {
    DtUserStruct user = FFAppState().user;
    SQLiteManager manager = SQLiteManager.instance;

    debugPrint("Before instance");
    debugPrint(user.toString());
    debugPrint(manager.toString());
    debugPrint(user.name);

    try {
      //Check Batchs to update status
      List<EvaluationSyncDetailsRow> finisheEvaluationList =
          await manager.getAllFinishedEvaluationsSyncSended();

我尝试在主类上声明 manager 并尝试在 workmanager 任务中使用它,但这不起作用。

这是我的 SQLiteManager 类的一部分

class SQLiteManager {
  SQLiteManager._();

  static SQLiteManager? _instance;
  static SQLiteManager get instance => _instance ??= SQLiteManager._();

  static late Database _database;
  Database get database => _database;

  static Future initialize() async {
    if (kIsWeb) {
      return;
    }
    _database = await initializeDatabaseFromDbFile(
      'dunometrics',
      'dunometrics.db',
    );
  }

我读过一些有关隔离的内容,但我不知道如何用它来解决它。

flutter sqlite flutter-workmanager
1个回答
0
投票

好吧,我尝试了很多方法,但没有一个起作用,正如这个问题中的回答Flutter:无法在 dart Isolate 中执行数据库 CRUD 看来不可能了。

如果您遇到类似的问题,我通过在获取/设置之前使用 SharedPreferences 重新加载来解决我想要做的事情,这样您就可以在主任务和 Workmanager 任务之间发送/接收信息,这对我来说已经足够了。

但是如果您确实想从workmanager任务访问sqlite数据库,那么您可以使用Drift创建数据库,然后您将能够访问不同隔离区之间的数据。 访问多个分离株的漂移数据库。

希望这可以帮助面临同样问题的人...

© www.soinside.com 2019 - 2024. All rights reserved.