android:在运行时编辑保存在本地存储上的json中的单个特性属性/值

vi4fp9gy  于 2021-07-12  发布在  Java
关注(0)|答案(0)|浏览(199)

最初,我使用的应用程序不应该在内存中创建和复制文件,但是因为在运行时资产是不可编辑的,所以这是必要的。但现在我在编辑文件时遇到了一个问题。
一些背景:有了这个,我需要复制到的文件 sdcard/Android/data/com.***.***/files/filname.geojson 从资产-只有在第一次运行的应用程序。

private void copyAssets() {
    AssetManager assetManager = getAssets();
    String[] files = null;
    try {
        files = assetManager.list("");
    } catch (IOException e) {
        Log.e("tag", "Failed to get asset file list.", e);
    }
    for(String filename : files) {
        InputStream in = null;
        OutputStream out = null;
        try {
            in = assetManager.open(filename);
            File outFile = new File(getExternalFilesDir(null), filename);
            out = new FileOutputStream(outFile);
            copyFile(in, out);
            in.close();
            in = null;
            out.flush();
            out.close();
            out = null;
        } catch(IOException e) {
            Log.e("tag", "Failed to copy asset file: " + filename, e);
        }
    }
}
    private void copyFile(InputStream in, OutputStream out) throws IOException {
        byte[] buffer = new byte[1024];
        int read;
        while((read = in.read(buffer)) != -1){
            out.write(buffer, 0, read);
        }
    }

现在,读取json本身只需调用:

try {
                    loadedMapStyle.addSource(new GeoJsonSource(GEOJSON_SOURCE_ID,
                            new URI("file:///sdcard/Android/data/com.***.***/files/filename.geojson")));
                } catch (URISyntaxException exception) {
                    Timber.d(exception);
                }

现在,当显示数据时,我可以在对话框中检索每个坐标属性,使用:

public boolean onMapClick(@NonNull final LatLng point) {
        PointF pointf = mapboxMap.getProjection().toScreenLocation(point);
        RectF rectF = new RectF(pointf.x - 20, pointf.y - 20, pointf.x + 20, pointf.y + 20);
        List<Feature> featureList = mapboxMap.queryRenderedFeatures(rectF, geoJsonLayerId);
        if (featureList.size() > 0) {
            for (final Feature feature : featureList) {
                Timber.d("Feature found with %1$s", feature.toJson());
                runOnUiThread(new Runnable() {

                    @Override
                    public void run() {

                        if
                        (!isFinishing()){
                            if(Dialogbusy){
                                return;
                            }
                            Dialogbusy = true;
                            final JsonObject featureJsonParsing  = feature.properties();
                            String property1 = featureJsonParsing.get("prop1").getAsString();
                            String property2 = featureJsonParsing.get("prop2").getAsString();
                            String property3 = featureJsonParsing.get("prop3").getAsString();

                            boolean property4 = featureJsonParsing.get("prop4").getAsBoolean();

这就是我的问题所在:编辑prop4,使其从true变为false,反之亦然,当然还要将更改反映在复制到存储的json文件中。

builder.setPositiveButton("Add to visited", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                    feature.properties().addProperty("prop4",true);
                                }
                            }); // Changes to 'true'

                            builder.setNeutralButton("Not Visited", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                    feature.properties().addProperty("prop4",false);

                                }
                            }); // Changes to 'false'

这使得它在日志中显示为已更改,但实际上并没有更改json文件中的任何内容。我看到我不需要额外的读/写权限,因为文件拷贝没有任何问题(当然我可能错了)
有什么帮助吗??=)

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题