正如标题中的问题所说。
我的数据库文件可能非常大,所以我不想不必要地复制它,当然也不想就地构建它。
如果 db 文件是一个颤振资产,sqlite 有没有办法直接访问它?
我看到有人建议我应该将资产的原始数据复制到文件中,然后访问它,但这是浪费存储。 或者我可以删除资产吗?
有没有一种简单的方法可以将数据库部署为资产以外的其他内容,即作为原始文件?
iOS(我认为,Android?)会要求你先将文件复制到应用程序的工作目录中。这是标准做法,也是在受保护文件系统中工作的一部分。如果以某种方式在您的应用程序捆绑包(将其视为原始的"主")和应用程序文档文件夹("工作副本")中都有副本是一个交易杀手,我想您也可以在初始应用程序启动时从服务器下载它,但是......时间就是金钱。
不过,这真的没什么大不了的。为此,请通过 pubspec.yaml 文件确保文件包含在应用程序捆绑包中:
flutter:
assets:
- assets/stored_data.db
然后,在打开数据库之前,将其从应用程序包复制到文档目录:
编辑:以下内容显然无法复制大文件; 如果您遇到此类问题,请参阅下面的iKK评论,因为看起来他已经找到了本机解决方案。但是,对于较小的文件,这应该可以正常工作。
// Create a new file within your document directory (Probably want to check whether it already exists first...)
Directory documentsDirectory = await getApplicationDocumentsDirectory();
String path = join(documentsDirectory.path, "working_data.db");
ByteData data = await rootBundle.load(join("assets", "stored_data.db"));
List<int> bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
await new File(path).writeAsBytes(bytes);
现在,您在应用程序的文档目录中拥有数据库,您应该能够从path.
打开它 例如,如果您使用的是tekartik/sqflite软件包(这是我最初获得这些说明的地方),您可以简单地:
Database db = await openDatabase(path); // Opens SQL database, working_data.db
没有理由(或能力)从应用程序包中删除原始副本(这会改变原始二进制文件 - 一个巨大的nono)。最终,操作系统本身最终可能会将这种渣滓卸载到云服务器或其他内存管理服务,但这是由平台决定的。