如何在 Flutter 中将文件从本地存储导入到数据库中

How to import file from local storage into DB in Flutter

我的目标是从 phone 本地存储 ~/Downloads 打开 CSV 文件并将其导入数据库。

我正在使用 Flutter,直到今天我已经查看了十几个示例但都没有成功。

但是我能够在控制台中打印文件的内容,但为此我必须在应用程序项目的 assets/res 文件夹中有一个文件。

如果我使用 getExternalStorageDirectory,我会得到 emulated/storage/0/ 作为结果。如何访问设备的内部存储(不是外部存储,因为 phone 使用的不会有 SD 卡选项,或者如果有,则不会使用)?

对于数据库,我能够使用 sqflite 获得一个工作示例,但由于我是菜鸟,我无法在我已经设计的应用程序中使用它。

使用包中的 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());
    }
  }

使用上面的代码 returns 文件的路径,例如“/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;
    }
  }

现在上面的代码应该 return CSV 文件的内容,它什么都不做。 CSV 文件包含项目列表。

有人可以告诉我原因并告诉我如何将文件的已解析内容保存为字符串或更好的字符串来代表文件中的每一列吗?

谢谢!