Как импортировать файл из локального хранилища в БД во 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-файл содержит список элементов.

Может кто-нибудь сообщить мне, почему, и будьте любезны показать мне, как я могу сохранить проанализированный контент файла в строку или, что еще лучше, строки, представляющие каждый столбец из файла?

СПАСИБО!

Другие вопросы по тегам