是否将Room Persistence Library与MPAndroidChart集成?

时间:2018-07-07 08:00:14

标签: android mpandroidchart android-room

这是Android Studio中的新功能,我想制作一个带有图表的应用程序,该图表将根据从数据库中检索到的数据实时更新。其主旨是将一些坐标存储到数据库中,并根据数据库的内容更新图表。到目前为止,我根据从this tutorial中学到的知识,并在MPAndroidChart Wiki,教程和示例代码中制作了一个。我将集成两者的唯一方法做的就是放弃适配器(因为我不知道它在MPAndroidChart中的作用)和RecyclerView,因为它是一张图表。它可以工作,但是有一些我似乎无法解决的错误。

1。)第一次运行时,没关系,添加Coordinates(我用于存储在数据库中的对象)会立即更新图表。但是,当我再次运行该应用程序并存储了之前的数据时,该图表将不会立即更新,并且基本上冻结了该图表,直到输入了大约10个条目为止。有时它毕竟不会更新。

2。)有时第一个点上出现一条伪影线(因此,在生成的点之间有一条线,然后其他那条线就没了,像这样)它仅在第二次运行时发生,依此类推

关于我哪里出了问题的任何想法?我认为这是适配器的一部分;但是我不知道如何用MPAndroidChart来制作..:/

编辑:这是我的一些代码。大部分内容与Room教程中的内容几乎相同,但是使用的是Coordinates对象。

这是MainActivity.java中onChanged的作用:

        mCoordinatesViewModel.getAllCoordinates().observe(this, new Observer<List<Coordinates>> () {
        @Override
        public void onChanged(@Nullable final List<Coordinates> coordinates){
            if (coordinates != null && !coordinates.isEmpty()) { updateChart(coordinates); }
        }
    });

updateChart函数:

    private void updateChart(List<Coordinates> coordinates){
    TextView displayViewNum = (TextView) textViewNum;

    LineData data = chartMain.getData();
    ILineDataSet set = data.getDataSetByIndex(0);

    if (set == null){
        set = createSet();
        data.addDataSet(set);
    }

    if (firstEntry) {
        set.removeFirst();
        firstEntry = false;
    }

    // retrieve from database
    int dx = (int) coordinates.get(coordinates.size() - 1).getX();
    float dy = (float) coordinates.get(coordinates.size() - 1).getY();

    String text = "(" + dx + ", " + dy + ")";
    displayViewNum.setText(text);

    // add to data as Entry
    Entry entry = new Entry(dx, dy);
    data.addEntry(entry, 0);

    data.notifyDataChanged();
    chartMain.notifyDataSetChanged();

    chartMain.setVisibleXRangeMaximum(10);
    chartMain.moveViewToX(data.getEntryCount());

}

我不知道要发布很长的时间才能发布什么代码。因此,如果有任何答复,我将一路进行编辑。

谢谢!

编辑:解决了核心问题,因为该应用无法从数据库中加载以前的数据。我试着做这个功能:

 private void initializeChart(List<Coordinates> coordinates){
    LineData data = chartMain.getData();
    ILineDataSet set = data.getDataSetByIndex(0);

    if (set == null){
        set = createSet();
        data.addDataSet(set);
    }

    if (firstEntry) {
        set.removeFirst();
        firstEntry = false;
    }

    // retrieve from database
    for (int i = 0; i < coordinates.size(); i++) {
        int dx = (int) coordinates.get(i).getX();
        float dy = (float) coordinates.get(i).getY();

        // add to data as Entry
        Entry entry = new Entry(dx, dy);
        data.addEntry(entry, 0);

        data.notifyDataChanged();
        chartMain.notifyDataSetChanged();

        chartMain.setVisibleXRangeMaximum(10);
        chartMain.moveViewToX(data.getEntryCount());
    }

}

并在onCreate函数上这样调用它:

initializeChart(mCoordinatesViewModel.getAllCoordinates().getValue());

但是现在它仍然崩溃。启动时是否有办法从Room数据库中获取以前的数据(如果有)?我想我可以从那里更新图表。

这是logcat产生的东西;红色文字改为斜体:

07-08 10:44:07.660 246-246/? I/auditd: type=1403 audit(0.0:2): policy loaded auid=4294967295 ses=4294967295 07-08 10:44:07.660 246-246/? W/auditd: type=1404 audit(0.0:3): enforcing=1 old_enforcing=0 auid=4294967295 ses=4294967295 07-08 10:44:08.180 1-1/? W/init: type=1400 audit(0.0:4): avc: denied { create } for name="preload" scontext=u:r:init:s0 tcontext=u:object_r:system_file:s0 tclass=dir permissive=0 type=1400 audit(0.0:5): avc: denied { create } for name="preload" scontext=u:r:init:s0 tcontext=u:object_r:system_file:s0 tclass=dir permissive=0 07-08 10:44:08.950 1-1/? W/init: type=1400 audit(0.0:6): avc: denied { create } for name="root_channel" scontext=u:r:init:s0 tcontext=u:object_r:root_execute_file:s0 tclass=dir permissive=0 07-08 10:44:09.090 248-248/? I//system/bin/tzdatacheck: tzdata file /data/misc/zoneinfo/current/tzdata does not exist. No action required.

--------- beginning of system

--------- beginning of system

0 个答案:

没有答案