java - 正确实现基于时间的对象存储

标签 java android serialization calendar

对于给定的任务,我应该存储一个对象,同时至少每天跟踪其创建时间。

我能找到的最简单的解决方案是使用日历根据对象创建的时间戳设置一年中的某一天。

这是一个简单形式的对象:

public class PhysicalActivity implements Serializable {

    private long mTimestamp;
    private int mYear;
    private int mMonthOfYear;
    private int mWeekOfYear;
    private int mWeekOfMonth;
    private int mDayOfYear;
    private int mDayOfMonth;
    private int mDayOfWeek;

    public PhysicalActivity(long timestamp){
        mTimestamp = timestamp;
        Calendar c = Calendar.getInstance();
        c.setTimeInMillis(mTimestamp);
        c.setTimeZone(TimeZone.getDefault());

        mYear = c.get(Calendar.YEAR);
        mMonthOfYear = c.get(Calendar.MONTH);
        mWeekOfYear = c.get(Calendar.WEEK_OF_YEAR);
        mWeekOfMonth = c.get(Calendar.WEEK_OF_MONTH);
        mDayOfYear = c.get(Calendar.DAY_OF_YEAR);
        mDayOfMonth = c.get(Calendar.DAY_OF_MONTH);
        mDayOfWeek = c.get(Calendar.DAY_OF_WEEK);
   }

   //Getters for all members...

}

然后我有这个对象,它保存 List<PhysicalActivity> 中的所有实例。 :

public class PhysicalActivityHolder implements Serializable {

    private long mCreationTimestamp;
    private long mLastUpdateTimestamp;
    private List<PhysicalActivity> mList;

    public PhysicalActivityHolder(long creationTimestamp) {
        mCreationTimestamp = creationTimestamp;

        if(mList == null) {
            mList = new ArrayList<PhysicalActivity>();
        }
    }

    public void addPhysicalActivity(PhysicalActivity pa){
        if(mList == null) {
            throw new NullPointerException("List is null");
        } else {
            mList.add(pa);
        }
    }

    public List<PhysicalActivity> getPhysicalActivitiesForDayOfYear(int dayOfYear) {
        List<PhysicalActivity> activities = null;
        for(PhysicalActivity p : mList) {
            if(p.getDayOfYear() == dayOfYear){
                activities.add(p);
            }
        }
        return activities;
    } 

    //Some similar methods for getting list by month of year, week of year...etc...
}

然后每当有新的 PhysicalActivity 时实例即将到来,我读了PhysicalACtivityHolder从磁盘(反序列化),将新实例添加到 List<>然后保存(序列化)Holder再次反对磁盘。

我希望你现在已经明白我的意思了。恐怕这不是一个好的解决方案。问题之一是如果设备的时间戳发生变化怎么办?那么整个想法就会被毁掉。

我很想知道您将如何执行这样的任务?更好的方法是什么?

最佳答案

首先,虽然与时间戳问题无关,但SQLite Database似乎是存储这些信息的更合适的媒介。特别是:

  • 您无需每次都序列化和反序列化整个集合。
  • 您无需将整个集合保留在内存中。
  • 您可以添加、删除或更新单个事件。
  • 您可以使用 SQL SELECT 语句轻松按年、月等查询。

关于“时间戳更改”部分(除非您有外部的、可信的时间数据源,例如服务器),是的,设备的日期或时间可以手动更改。然而,这会有多大的问题呢?该数据似乎并不严格依赖于准确的时间。

关于java - 正确实现基于时间的对象存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24544130/

相关文章:

json - DateTimes 反序列化错误 : JsonConvert is returning wrong dates

java - 局部变量action可能还没有初始化?

java - 以编程方式从另一个项目创建 Eclipse Java 项目

java - 我看不到为什么出现 'cannot resolve symbol'错误

java - fragment 数组上的 NullPointerException

android - 初始化 fragment ,但不立即显示

java - 来自命令行的 SWT 和 JFace

java - 将从安卓设备接收到的数据输出为声音

serialization - .NET WebAPI 序列化 k_BackingField 肮脏

java - 将可序列化数组从一个 Activity 传递到另一个 Activity 时发生类转换异常