Как импортировать файл из локального хранилища в БД во Flutter

Моя цель - открыть файл CSV из локального хранилища телефона ~ / Downloads и импортировать его в БД.

Я использую Flutter и до сих пор безуспешно просмотрел более дюжины примеров.

Однако мне удалось распечатать содержимое файла в консоли, но для этого мне нужно было иметь файл в папке assets / res в проекте приложения.

Если я использую getExternalStorageDirectory, в результате я получаю эмуляцию / storage / 0 /. Как попасть во внутреннее хранилище устройства (не во внешнее хранилище, поскольку в используемом телефоне не будет опции для SD-карты, или, если она будет, она не будет использоваться)?

Что касается БД, мне удалось получить рабочий пример с использованием sqflite, но, поскольку я полный нуб, я не могу заставить его работать в моем уже разработанном приложении.


person jurijk    schedule 10.01.2019    source источник


Ответы (2)


Откройте файл как текстовый документ с помощью open_file из пакета: open_file / open_file.dart и самостоятельно проанализируйте его содержимое.

См. https://pub.dartlang.org/documentation/open_file/latest/.

person Community    schedule 10.01.2019
comment
Я предполагаю, что это работает, поскольку кажется, что он хочет получить доступ к правильному каталогу, поскольку я получаю следующую ошибку: The webpage at file:///sdcard/Download/1.txt could not be loaded because: net::ERR_ACCESS_DENIED . Это нормально, и почему я получаю эту ошибку, если в файле AndroidManifest.xml установлен <uses-permission android:name="android.permission.INTERNET"/>? - person jurijk; 10.01.2019
comment
Проблема решена, по крайней мере, часть с net :: ERR_ACCESS_DENIED, поскольку я дублировал набор разрешений в файле AndroidManifest. Однако теперь, когда я вызываю это в onPress, я не получаю ничего, ни ошибки, ни подтверждения, ничего. Я установил печать (нажата кнопка «Сохранить») и ничего не оставил, кроме текста, отображаемого в консоли. Я чего-то не вижу, и если это нормально, как я могу отобразить содержимое файла или даже проанализировать его? - person jurijk; 10.01.2019

Вернемся к началу и все же немного ближе к нужному мне решению. У меня есть 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-файл содержит список элементов.

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

БЛАГОДАРНОСТЬ!

person jurijk    schedule 21.01.2019
comment
Теперь я еще на один шаг ближе к получению нужного мне результата. Таким образом, путь к файлу больше не является проблемой, но что мне нужно сделать дальше, так это сохранить содержимое этого файла в массиве, чтобы я мог позже импортировать это в БД. Может кто-нибудь указать мне самый простой способ добиться этого? Пожалуйста, имейте в виду, что я начал с этого совсем недавно и довольно давно закончил программирование. БЛАГОДАРНОСТЬ! - person jurijk; 23.01.2019