将资产从捆绑包复制到文件系统

时间:2017-07-09 00:45:22

标签: dart flutter

我试图将sqlite数据库从根分发包复制到文件系统上以便使用它。

我尝试了许多不同的方法,但它总是最终向磁盘写入不正确的数据量。我使用的代码如下所示:

Directory appDocDir = await getExternalStorageDirectory();
String path = join(appDocDir.path, "data.db");
bool exists = await new File(path).exists();
if (!exists) {
  var out = new File(path).openWrite();

  var data = await rootBundle.load("assets/data.sqlite");
  var list = data.buffer.asUint8List();
  out.write(list);
  out.close();
}

2 个答案:

答案 0 :(得分:1)

您无法使用collections.defaultdict(旨在对File参数进行操作)将Uint8List的内容写入String。您最终会在String上调用toString()来编写Uint8List获得的Uint8List的UTF-8编码表示,这可能比列表的实际内容大得多。

相反,您可以使用IOSink.write将{{1}}写入文件。

在您提供的示例中,您还可以使用IOSink.add一次性编写整个文件。

答案 1 :(得分:1)

我能够做到以下几点。

ByteData data = await rootBundle.load("data.sqlite");
List<int> bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);

Directory appDocDir = await getApplicationDocumentsDirectory()
String path = join(appDocDir.path, "data.db");
await File(path).writeAsBytes(bytes);