2017-07-09 4 views
1

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(); 
} 

答えて

0

あなたは(String引数上で動作するように設計されている)IOSink.writeを使用してUint8ListFileの内容を書き込むことができません。 Uint8ListtoString()を呼び出すことによって得られたStringのUTF-8でエンコードされた表現を書くことになります。これはおそらくリストの実際の内容よりもはるかに大きくなります。

IOSink.addを使用してUint8Listをファイルに書き込むことができます。

提供した例では、new File(path).writeAsBytes(list)を使用してファイル全体を一度に書き込むこともできます。

+0

ありがとうございます! 'add 'と' write'の違いは、C++から来た私にはすぐには分かりませんでした。 – xen

関連する問題