【发布时间】:2019-01-12 14:59:08
【问题描述】:
我尝试使用大型数据库文件。因此,我的代码将此文件从 Assets 文件夹复制到 Application-Documents-Folder,如下面的代码示例所示。
对于小文件,我的代码工作得很好,我可以很好地使用我的数据库。
但是,如果我尝试使用较大的 db 文件 (>665MB),事情就会开始崩溃,就像我的 Flutter 应用程序的 Android 部分一样。 (事实上,iOS 工作得非常好,不管 db-File 真的有多大......)。仅适用于 Android,大型 db-File 会破坏事物。
以下 Dart 代码不适用于 Android 中的大文件 (>665MB) - (但它适用于小文件):
Future<Database> initializeDatabase() async {
Directory directory = await getApplicationDocumentsDirectory();
var dbPath = join(directory.path, "ch_departures.db");
// copy db file from Assets folder to Documents folder (only if not already there...)
if (FileSystemEntity.typeSync(dbPath) == FileSystemEntityType.notFound) {
ByteData data = await rootBundle.load("assets/ch_departures.db");
writeToFile(data, dbPath);
}
// Open/create the database at a given path
var departuresDatabase = await openDatabase(dbPath);
return departuresDatabase;
}
// HERE IS WHERE THE CODE CRASHES (WHEN TRYING TO WRITE THE LOADED BYTES)
void writeToFile(ByteData data, String path) {
final buffer = data.buffer;
return new File(path).writeAsBytesSync(
buffer.asUint8List(data.offsetInBytes, data.lengthInBytes));
}
我尝试使用我的 Flutter 应用的 Android 部分的 gradle.properties 文件。
在 gradle.properties 里面,我试过了:
org.gradle.jvmargs=-Xmx3g -XX:MaxPermSize=2048m
但不幸的是,没有成功。
您对如何使用大型 (>665MB) 文件完成所有这些工作有任何想法吗????
【问题讨论】:
-
它是如何失败的?有任何错误信息吗?
-
不——根本没有错误信息!!不幸的是,完全崩溃,没有任何消息....
-
我也尝试过原生插件。我在 iOS 上取得了成功(因为我知道 Swift) - 但我不知道如何在 Kotlin 中为原生 Android 部分做到这一点......但我认为,这样一个简单的文件副本应该在 Flutter 中工作(不走这条路使用本机代码),不是吗?除了 Assets 文件夹之外,有什么方法可以直接将文件提供给二进制文件,然后从 Flutter 应用程序(即 iOS 和 Android)访问它 - 即无需将其从 Assets 文件夹复制到 Application Documents 文件夹? ?
-
如果我的所有想法都行不通 - 原生 Kotlin 代码将如何将资产文件复制到 Android 原生插件中的应用程序文档文件夹?
-
flutter.io/docs/development/ui/… 提供了一些有关如何使资产可用于本机平台的信息。我可以想象这个问题是由巨大的内存使用引起的。整个文件被读入内存,然后写回。最好作为流读取并将流转发到目标文件或使用一些操作系统复制功能。
标签: android ios file dart flutter