Как импортировать файл из локального хранилища в БД во Flutter
Моя цель - открыть файл CSV из локального хранилища телефона ~/Downloads и импортировать его в БД.
Я использую Flutter и по сей день я просмотрел более десятка примеров без успеха.
Однако я смог получить содержимое файла, напечатанного в консоли, но для этого мне нужно было иметь файл в папке assets/res в проекте приложения.
Если я использую getExternalStorageDirectory, в результате я получаю эмуляцию /storage/0/. Как получить доступ к внутреннему хранилищу устройства (не внешнему хранилищу, поскольку используемый телефон не будет иметь опцию для SD-карты или, если они будут, она не будет использоваться)?
Что касается БД, я смог получить рабочий пример с использованием sqflite, но я, как и я, просто не могу заставить его работать в моем уже разработанном приложении.
2 ответа
Откройте файл как текстовый документ, используя open_file из пакета:open_file/open_file.dart, и проанализируйте его содержимое самостоятельно.
См. https://pub.dartlang.org/documentation/open_file/latest/
Назад к началу и все же немного ближе к решению, которое мне нужно. У меня есть file_picker ( https://pub.dartlang.org/packages/file_picker), который помогает выбрать файл с помощью проводника:
String _filePath;
void getFilePath() async {
try {
String filePath = await FilePicker.getFilePath(
type: FileType.CUSTOM, fileExtension: 'csv');
if (filePath == '') {
return;
}
print("Path: " + filePath);
setState(() {
this._filePath = filePath;
});
} on PlatformException catch (e) {
print("Error picking file: " + e.toString());
}
}
Использование приведенного выше кода возвращает путь к файлу, например, "/storage/emulated/0/Download/1.csv".
Теперь я использую этот путь, чтобы прочитать содержимое файла:
...
RaisedButton(
child: const Text('Import data - dummy'),
color: Theme.of(context).accentColor,
elevation: 4.0,
splashColor: Colors.blueGrey,
onPressed: () {
print('Verifying click done');
// Show contents of the file
readContents();
},
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: getFilePath,
tooltip: 'Choose file to import',
child: new Icon(Icons.sd_storage),
)
...
Future<File> get _localFile async {
final path = await _filePath;
return File('$path');
}
Future<int> readContents() async {
try {
final file = await _localFile;
// Read the file
String contents = await file.readAsString();
return int.parse(contents);
} catch (e) {
// If we encounter an error, return 0
return 0;
}
}
Теперь, так как приведенный выше код должен возвращать содержимое файла CSV, он ничего не делает. CSV-файл содержит список элементов.
Может кто-нибудь сообщить мне, почему, и будьте любезны показать мне, как я могу сохранить проанализированный контент файла в строку или, что еще лучше, строки, представляющие каждый столбец из файла?
СПАСИБО!