【问题标题】:save user data during a day (the same day -> many user data)在一天内保存用户数据(同一天 -> 许多用户数据)
【发布时间】:2013-04-20 19:12:00
【问题描述】:

我有一个应用程序,用户在 edittext 中输入数据并按下保存按钮。

通过按“保存”,我将用户数据(在一列中)和当前日期(在另一列中)保存在一个文件中。

然后,我按下另一个按钮并绘制(使用 achartengine)日期(x 轴)数据(y 轴)。

因此,在一天中输入数据会导致保存例如:“1”(用户数据)-> 20/4/2013,“2”-> 20/4/2013,“3”-> 20/ 2013 年 4 月。

在情节中,我在 y 轴上有 3 个点(好的),在 x 轴上有 3 个点(不好)。

我想在 x 轴上有一个点,因为数据是在同一天输入的。

我保存数据:

public void savefunc(){

        SimpleDateFormat thedate = new SimpleDateFormat("dd/MM/yyyy"); 
        Date d=new Date();

        String formattedDate=thedate.format(d);
        Log.d("tag","format"+formattedDate);
        dates_Strings.add(formattedDate);


        double thedata=Double.parseDouble(value.getText().toString().trim());
            mydata.add(thedata);


        File sdCard = Environment.getExternalStorageDirectory();
        File directory = new File (sdCard, "MyFiles");
        directory.mkdirs();            
        File file = new File(directory, filename);

        FileOutputStream fos;

        //saving them
        try {
           fos = new FileOutputStream(file);

              BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
              for (int i=0;i<mydata.size();i++){
                 bw.write(mydata.get(i)+","+dates_Strings.get(i)+"\n");
              }
              ...

如何保存一天中的用户数据?

也许在这里检查一下:Date d=new Date();?检查是否是同一天。

或者在这里:bw.write(mydata.get(i)+","+dates_Strings.get(i)+"\n");

但我想不通。

例如,我在日期“20/4/2013”​​中输入数据“1”、“2”、“3”。

这是我现在使用我的代码得到的结果:

但我需要如下图:应将同一天输入的数据放在一起::

---------------更新------------------------------- -------------------

  mRenderer.setXLabels(0);
    for (int i=0;i<mydata.size();i++){

        mRenderer.addXTextLabel(i,dates_Strings.get(i));

        Date lastDate=null;
        String lastdate="";

        try{

    // the initial date
Date initialDate=formatter.parse(dates_Strings.get(mydata.size()-1));

Calendar c = Calendar.getInstance();
c.setTime(initialDate);
c.add(Calendar.DATE, 1);  // increase date by one 
lastDate =c.getTime();                  

}catch ...
      }
    mRenderer.setXAxisMax(lastDate.getTime());
    mRenderer.addXTextLabel(i,dates_Strings.get(i));
    }

【问题讨论】:

  • 也包括快照,以使其更清晰

标签: java android achartengine


【解决方案1】:

这确实是一个 AChartEngine 问题。内部模型以前保存在ArrayLists 中,这些问题不存在。在某个时候,社区努力通过大量数据点使 AChartEngine 更快。那时,模型开始使用Map 而不是ArrayList。此实现防止了多次添加相同的 X 值。但是,为了解决这个问题,我向 X 添加了一个非常小的值,如果它已经存在的话。在您的示例中,第一个值为20/04/2013 00:00:00.0,第二个值为20/04/2013 00:00:00.001,第三个值为20/04/2013 00:00:00.002

现在,您的问题的解决方案是在 X 轴上有更宽的范围。

renderer.setXAxisMax(someDate.getTime());

其中someDate 可以是21/04/2013

【讨论】:

  • :我照你说的做了,似乎奏效了。我在 2013 年 4 月 5 日输入了一些数据,情节还可以,就像我上面的那个一样。但是,当我输入一些数据时2013 年 5 月 5 日的其他数据 x 轴中的 04/05/2013 被 2013 年 5 月 5 日和 y 轴中的所有数据替换。
  • :也许是因为我有 "Date someDate=null;"?另外,我使用 "SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy",Locale.US);"日期。(感谢您的帮助)
  • :我更新了。“dates_Strings”是一个包含日期的字符串列表。我把“somedate”作为我保存(使用)的第一个日期。
  • 只需调用 setXAxisMax() 的某个日期晚于最后一个值。
  • :我更新了我的帖子,显示了我使用的代码。我仍然得到相同的结果。你能检查我是否正确定义了初始日期和最后日期吗?另外,我使用 lastDate=c。 getTime() 然后“mRenderer.setXAxisMax(lastDate.getTime());” (再次lastDate.getTime())。我不确定整个事情。我试图将初始日期定义为最后一个值(mydata.size()-1),然后将该日期加一以便放置在 setXAxisMax. 谢谢
【解决方案2】:

好的。

当您调用 new Date() 时,您还可以确定创建时间(默认格式为:1970 年 1 月 1 日,格林威治标准时间 00:00:00)。因为您的积分是在不同的时间但相同的日期创建的,所以您的积分不一致。

所以你应该这样做:

Calendar thisDay = Calendar.getInstance();
thisDay.set(Calendar.HOUR, 0);
thisDay.set(Calendar.MINUTE, 0);
thisDay.set(Calendar.SECOND, 0);
Date d=thisDay.getTime();//this returns Date :) - it is funny but true

那么您可以使用 d 作为当前日期:)。

希望这是真的并且对你有帮助, 托尼

【讨论】:

  • @:使用上面的然后"SimpleDateFormat thedate = new SimpleDateFormat("dd/MM/yyyy");"和"String formattedDate=thedate.format(d); dates_Strings.add(formattedDate) ;" , (因为我想将日期存储为 Strings )没有用。仍然是同样的问题..
  • :那么,您对此有什么其他想法吗?也许检查一下日期是否相同?谢谢
  • 当您从 db 读取数据时,您如何创建一个日期对象?
  • :对不起,我没听懂你的问题?
  • 当您从文件中加载数据时(将数据存储到文件中实际上并不好 - 为什么不使用 sqlite?),如何将其转换为日期?您从 dd/MM/yyyy 中的 txt 文件日期读取。你如何把这个字符串放入日期对象中?
【解决方案3】:

这个问题有几种可能的解决方案:

  1. 不是日期,而是日期的 unix 时间(长值)。为了显示它,您可以将 unix time 转换为 formatted date 。

  2. 由于 excel 可以处理日期,编辑输出文件并使用“=Date(year,month,day)”或“=DATEVALUE("2013/4/20")”

这都是因为问题甚至与 android 无关。这是关于显示数据。数据没问题。这就是你展示它的方式。

【讨论】:

  • :我不知道该怎么做 1.你能给我一个基于我的代码的例子吗?另外,我不明白 2.我应该怎么做?谢谢你的帮助。
  • 这两个例子都不涉及安卓代码(除了你只使用 Date.getTime() 的#1)。其余的在 excel 中完成。对于#2,您创建一个引用日期列的新列。如果日期的列是“A”并且新列是“C”,则根据“A”创建“C”单元格的值:“=DATEVALUE($A1)”为第一个单元格,“=DATEVALUE($ A2)" 为第二个,依此类推。当然,不用每次都写,你可以拖动单元格右下角的图标来自动创建新的单元格。
  • :我想把情节画对。我不太关心excel文件。
  • 因此,如果您不关心 excel 文件,只需创建自己的应用程序(使用您希望的任何编程语言和平台)即可很好地显示它。数据还可以,可以处理。
  • :但问题是我无法处理x轴图中的数据。
【解决方案4】:

如果我没记错的话,这不是保存或加载数据的问题,而只是显示数据的问题。您的图形算法应该识别相等的日期并且不要为其创建新条目。

事实上,日期似乎被视为标签,而不是 x 轴值,这是合理的,因为日期字符串不是数字。

我建议检查 achartengine 是否有额外提供 x 值的方法,然后仅在下一个条目的日期字符串与上一个条目不同时才让它们增加。

您可能必须为 achartengine 提供不同的模型。

我不认为这是一个保存问题,因为存储的日期是正确的,所以那里的任何行为大部分都符合预期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 2021-04-07
    • 2022-11-06
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 2019-02-12
    相关资源
    最近更新 更多