【问题标题】:How to fix "flutter: DatabaseException(open_failed...)"?如何修复“颤振:DatabaseException(open_failed ...)”?
【发布时间】:2019-09-23 05:58:44
【问题描述】:

我正在尝试在我的 iPhone 7 上运行我的颤振应用程序,但我收到一条错误消息。在我的 Android 手机和 iPhone XR 模拟器上运行该应用程序运行良好。 我还尝试在我的 iPad 上测试该应用程序,我得到了完全相同的错误消息,如下所示。用新副本替换 ios 文件夹并不能解决问题。

我尝试运行最新的 sqflite 版本,flutter doctor 没有显示任何问题。

Future<Database> initDatabase() async {
    //Get the dir
    Directory directory = await getApplicationDocumentsDirectory();
    String path = directory.path + 'posts.db';

    //Open or Create the database using given path
    var postsDataBase = openDatabase(path, version: 1, onCreate: _createDb);
    return postsDataBase;
  }

[VERBOSE-2:ui_dart_state.cc(148)] Unhandled Exception: DatabaseException(open_failed /var/mobile/Containers/Data/Application/04C0A23F-6C36-42C2-9CE5-C7C5370F59FA/Documentsposts.db)
#0      wrapDatabaseException 
package:sqflite/src/exception_impl.dart:11
<asynchronous suspension>
#1      SqfliteDatabaseFactoryImpl.wrapDatabaseException 
package:sqflite/src/factory_impl.dart:29
#2      SqfliteDatabaseMixin.safeInvokeMethod 
package:sqflite/src/database_mixin.dart:184
#3      SqfliteDatabaseMixin.openDatabase 
package:sqflite/src/database_mixin.dart:519
<asynchronous suspension>
#4      SqfliteDatabaseMixin.doOpen 
package:sqflite/src/database_mixin.dart:612
<asynchronous suspension>
#5      SqfliteDatabaseOpenHelper.openDatabase 
package:sqflite/src/database.dart:32
<asynchronous suspension>
#6      SqfliteDatabaseFactoryMixin.openDatabase.<anonymous closure> 
package:sqflite/src/factory_mixin.dart:100
<asynchronous suspension>
#7      ReentrantLock.synchronized.<anonymous closure>.<anonymous closure> 
package:synchronized/src/reentrant_lock.dart:33
#8      _rootRun  (dart:async/zone.dart:1124:13)

【问题讨论】:

  • 什么是完整的堆栈跟踪以及导致您出现问题的代码?
  • 你是指调试控制台的摘录吗?
  • 是的,调试控制台,发布前 5-8 帧
  • 你在哪里使用openDatabase的代码是什么?
  • 我记得当我启动 XCode 升级到 Swift 5 时有一个弹出窗口,我猜。这可能是个问题吗?

标签: ios database flutter sqflite


【解决方案1】:

检查父目录是否存在,并尝试使用最新的sqlite版本。

【讨论】:

    【解决方案2】:

    这对我有用。

    String path = directory.path + '/' + 'posts.db';
    

    【讨论】:

      【解决方案3】:

      正如您在日志中看到的,您构建的路径以/Documentsposts.db 结尾,我认为您可能想要/Documents/posts.db

      不要使用加号构建路径,而是使用包 path 中的 join

      即而不是:

      String path = directory.path + 'posts.db';
      

      var path = join(directory.path, 'posts.db');
      

      在 iOS 上,您还应该首先确保父目录存在。

      【讨论】:

        猜你喜欢
        • 2020-01-27
        • 2021-04-08
        • 2021-11-20
        • 2021-01-29
        • 2019-09-28
        • 2020-02-01
        • 2021-04-11
        • 2019-12-02
        • 2020-08-31
        相关资源
        最近更新 更多