3

我正在尝试将预填充的数据加载到我的颤振应用程序中。我在项目的根目录中创建了“assets”文件夹并将“mydb.sql”文件放入该文件夹中。

在 pubspec.yaml 中添加了该文件引用

assets:
  - assets/mydb.sql

下面是我访问数据库的 DBHandler.dart 文件代码

  static Database _db;
  String dbName = "mydb.sql";

  Future<Database> get db async {
    if (_db != null) return _db;
    _db = await initDb();
    return _db;
  }

  initDb() async {
    var databasesPath = await getDatabasesPath();
    var path = join(databasesPath, dbName);
    var exists = await databaseExists(path);
    if (!exists) {
      // Should happen only the first time you launch your application
      print("Creating new copy from asset");

      // Make sure the parent directory exists
      try {
        await io.Directory(dirname(path)).create(recursive: true);
      } catch (_) {}

      // Copy from asset
      ByteData data = await rootBundle.load(join('assets',dbName));
      List<int> bytes =
          data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);

      // Write and flush the bytes written
      await io.File(path).writeAsBytes(bytes, flush: true);
    } else {
      print("Opening existing database");
    }
    return await openDatabase(path);
  }

我得到的错误是

I/flutter (16900): Creating new copy from asset
E/flutter (16900): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: Unable to load asset: assets/mydb.sql
E/flutter (16900): #0      PlatformAssetBundle.load (package:flutter/src/services/asset_bundle.dart:221:7)
E/flutter (16900): <asynchronous suspension>
E/flutter (16900): #1      DBHandler.initDb (package:MyApp/db/DBHandler.dart:36:40)

这是代码中给定的行下方。

ByteData 数据 = 等待 rootBundle.load(join('assets',dbName));

4

1 回答 1

3

我的代码中有 2 个问题。写这篇文章是为了帮助其他人犯同样的错误。

1. pubspec.yaml 中的缩进
我犯了一个重大的愚蠢错误。我只是看着

assets:
  - assets/mydb.sql

我的 pubspec 文件是这样的

  flutter:

  # The following line ensures that the Material Icons font is
  # included with your application, so that you can use the icons in
  # the material Icons class.
  uses-material-design: true

  # To add assets to your application, add an assets section, like this:
  assets:
    - assets/mydb.sqlite

我没有注意到我的“颤振:”和“资产:”处于同一水平。所以我把它改成

flutter:

  # The following line ensures that the Material Icons font is
  # included with your application, so that you can use the icons in
  # the material Icons class.
  uses-material-design: true

  # To add assets to your application, add an assets section, like this:
    assets:
      - assets/mydb.sqlite

注意缩进('assets:' 之前的 2 个空格)

2. sql文件不是db 所以,我在解决了第一个问题后就遇到了这个问题。我得到 mydb.sql 不是数据库。所以我从 Sqlite 数据库浏览器将我的数据库导出为“.sqlite”文件。& 更新了我的 pubspec & DBHandler 文件。

感谢@Shababb Karim指出 pubspec.yaml 问题的评论。

于 2019-06-04T14:03:25.123 回答