【问题标题】:How to import file from local storage into DB in Flutter如何在 Flutter 中将文件从本地存储导入 DB
【发布时间】:2019-06-04 23:52:56
【问题描述】:

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

我正在使用 Flutter,到目前为止,我已经查看了十几个示例,但都没有成功。

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

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

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

【问题讨论】:

    标签: android file dart flutter sqflite


    【解决方案1】:

    回到开头,但离我需要的解决方案更近了一点。我有 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 文件包含项目列表。

    有人可以告诉我为什么,并且好心地告诉我如何将文件的解析内容保存为字符串,甚至更好的字符串来表示文件中的每一列吗?

    谢谢!

    【讨论】:

    • 现在我离得到我需要的结果又近了一步。所以文件的路径不再是问题,但我接下来需要做的是把文件的内容保存到一个数组,以便我以后可以将其导入数据库。有人可以指出实现这一目标的最简单方法吗?请记住,我最近才开始使用它,并且很久以前就完成了编程。谢谢!
    【解决方案2】:

    使用 package:open_file/open_file.dart 中的 open_file 将文件作为文本文档打开并自己解析内容。

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

    【讨论】:

    • 我猜它可以正常工作,因为它似乎想要访问正确的目录,因为我收到以下错误:The webpage at file:///sdcard/Download/1.txt could not be loaded because: net::ERR_ACCESS_DENIED 。这可以吗?当我在 AndroidManifest.xml 文件中设置了&lt;uses-permission android:name="android.permission.INTERNET"/&gt; 时,为什么会出现此错误?
    • 问题解决了,至少是 net::ERR_ACCESS_DENIED 的部分,因为我在 AndroidManifest 文件中复制了权限集。然而,现在,当我在 onPress 中调用它时,我什么也没有得到,没有错误,没有确认,什么也没有。我设置了打印(“按下保存按钮”)并且除了控制台中显示的文本之外什么都没有。我没有看到什么吗?如果没问题,我怎样才能显示文件的内容甚至解析它?
    猜你喜欢
    • 2021-04-24
    • 2020-08-25
    • 2019-09-17
    • 1970-01-01
    • 2022-08-22
    • 2020-08-21
    • 1970-01-01
    • 2017-01-15
    • 2020-03-24
    相关资源
    最近更新 更多