【问题标题】:Storing a string on mobile device using gluon mobile plugin使用胶子移动插件在移动设备上存储字符串
【发布时间】:2017-02-06 05:19:29
【问题描述】:

我想将文本区域中的字符串保存到设备,然后在重新打开应用程序后重新加载。我尝试按照示例(link)进行操作,但无法使其正常工作。当我尝试读取文件并使用 StringInputConverter 时出现主要问题。

private void saveAndLoad(TextArea textArea){
        File textFile = new File(ROOT_DIR,"text_file");
        String text2 = textArea.getText();
        String loadedFile = "none";
        if (textFile.exists()){
            FileClient fileClient = FileClient.create(textFile);
        loadedFile = DataProvider.retrieveObject(fileClient.createObjectDataReader(
                new StringInputConverter()));
        }
        try(FileWriter writer = new FileWriter(textFile)){
            writer.write(textArea.getText());
        } catch (IOException e) {
            e.printStackTrace();
        }

        textArea.setText(text2);
    }

编辑:插入的代码,我试图开始读取文件和我得到的错误图像

【问题讨论】:

  • ROOT_DIR 来自哪里?发布您遇到的错误以及重现它们的方法
  • 来自静态初始化器: static { ROOT_DIR = Services.get(StorageService.class) .flatMap(StorageService::getPrivateStorage) .orElseThrow(() -> new RuntimeException("Error")); }
  • 你会遇到什么错误?
  • 我已经用代码和我收到的错误编辑了我的帖子

标签: android javafx local-storage gluon-mobile


【解决方案1】:

如果您查看DataProvider::retrieveObject 文档:

使用指定的 ObjectDataReader 检索对象。返回一个 GluonObservableObject,它将包含读取操作成功完成时的对象。

它返回GluonObservableObject<String>,它是字符串的可观察包装,而不是字符串本身。

你需要先获取observable,当操作成功结束后你就可以取回字符串了:

if (textFile.exists()) {
    FileClient fileClient = FileClient.create(textFile);
    GluonObservableObject<String> retrieveObject = DataProvider
            .retrieveObject(fileClient.createObjectDataReader(new StringInputConverter()));

    retrieveObject.stateProperty().addListener((obs, ov, nv) -> {
        if (ConnectState.SUCCEEDED.equals(nv)) {
            loadedFile = retrieveObject.get();
        }
    });
}

这是此功能的快速实现:

public class BasicView extends View {

    private static final File ROOT_DIR;
    static {
        ROOT_DIR = Services.get(StorageService.class)
                .flatMap(StorageService::getPrivateStorage)
                .orElseThrow(() -> new RuntimeException("Error")); 
    }

    private final File textFile;
    private final TextField textField;
    private String loadedFile = "none";

    public BasicView(String name) {
        super(name);

        textFile = new File(ROOT_DIR, "text_file");
        textField = new TextField();

        VBox controls = new VBox(15.0, textField);
        controls.setAlignment(Pos.CENTER);
        controls.setPadding(new Insets(30));

        setCenter(controls);
    }

    @Override
    protected void updateAppBar(AppBar appBar) {
        appBar.setNavIcon(MaterialDesignIcon.MENU.button(e -> System.out.println("Menu")));
        appBar.setTitleText("Basic View");
        appBar.getActionItems().add(MaterialDesignIcon.SAVE.button(e -> save()));
        appBar.getActionItems().add(MaterialDesignIcon.RESTORE_PAGE.button(e -> restore()));
    }

    private void save() {
        try (FileWriter writer = new FileWriter(textFile)) {
            writer.write(textField.getText());
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    private void restore() {
        if (textFile.exists()) {
            FileClient fileClient = FileClient.create(textFile);
            GluonObservableObject<String> retrieveObject = DataProvider
                    .retrieveObject(fileClient.createObjectDataReader(new StringInputConverter()));

            retrieveObject.stateProperty().addListener((obs, ov, nv) -> {
                if (ConnectState.SUCCEEDED.equals(nv)) {
                    loadedFile = retrieveObject.get();
                    textField.setText(loadedFile);
                }
            });
        }
    }
}

【讨论】:

  • 我误用了retrieveObject.addListener((obs, ov, nv) -&gt; { if (ConnectState.SUCCEEDED.equals(nv)) { loadedFile = retrieveObject.get(); } });。直到看到输出我才意识到这一点。它将文件内容作为新值返回。 retrieveObject.addListener((obs, ov, nv) -&gt; { loadedFile = nv; }); 有缺点吗?
猜你喜欢
  • 2010-10-07
  • 1970-01-01
  • 2023-03-11
  • 2013-07-19
  • 2018-07-12
  • 1970-01-01
  • 2022-08-05
  • 1970-01-01
  • 2023-03-24
相关资源
最近更新 更多