我在使用SQLite的Android应用程序上处理日期遇到了一些麻烦。 我有几个问题:

我应该使用什么类型存储日期在SQLite(文本,整数,…)? 给出了存储日期的最佳方式,我如何使用ContentValues正确存储它? 从SQLite数据库中检索日期的最佳方法是什么? 如何在SQLite上进行sql选择,按日期排序结果?


当前回答

我更喜欢这个。这不是最好的方法,但却是一个快速的解决方案。

//Building the table includes:
StringBuilder query= new StringBuilder();
query.append("CREATE TABLE "+TABLE_NAME+ " (");
query.append(COLUMN_ID+"int primary key autoincrement,");
query.append(COLUMN_CREATION_DATE+" DATE)");

//Inserting the data includes this:
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
values.put(COLUMN_CREATION_DATE,dateFormat.format(reactionGame.getCreationDate())); 

// Fetching the data includes this:
try {
   java.util.Date creationDate = dateFormat.parse(cursor.getString(0);
   YourObject.setCreationDate(creationDate));
} catch (Exception e) {
   YourObject.setCreationDate(null);
}

其他回答

您可以使用文本字段在SQLite中存储日期。

以UTC格式存储日期,默认情况下,如果使用datetime('now') (yyyy-MM-dd HH:mm:ss)将允许按日期列排序。

从SQLite中检索日期作为字符串,然后使用Calendar或android.text.format.DateUtils.formatDateTime方法将它们格式化/转换为所需的本地区域化格式。

这是我使用的一个区域化格式化器方法;

public static String formatDateTime(Context context, String timeToFormat) {

    String finalDateTime = "";          

    SimpleDateFormat iso8601Format = new SimpleDateFormat(
            "yyyy-MM-dd HH:mm:ss");

    Date date = null;
    if (timeToFormat != null) {
        try {
            date = iso8601Format.parse(timeToFormat);
        } catch (ParseException e) {
            date = null;
        }

        if (date != null) {
            long when = date.getTime();
            int flags = 0;
            flags |= android.text.format.DateUtils.FORMAT_SHOW_TIME;
            flags |= android.text.format.DateUtils.FORMAT_SHOW_DATE;
            flags |= android.text.format.DateUtils.FORMAT_ABBREV_MONTH;
            flags |= android.text.format.DateUtils.FORMAT_SHOW_YEAR;

            finalDateTime = android.text.format.DateUtils.formatDateTime(context,
            when + TimeZone.getDefault().getOffset(when), flags);               
        }
    }
    return finalDateTime;
}

我更喜欢这个。这不是最好的方法,但却是一个快速的解决方案。

//Building the table includes:
StringBuilder query= new StringBuilder();
query.append("CREATE TABLE "+TABLE_NAME+ " (");
query.append(COLUMN_ID+"int primary key autoincrement,");
query.append(COLUMN_CREATION_DATE+" DATE)");

//Inserting the data includes this:
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
values.put(COLUMN_CREATION_DATE,dateFormat.format(reactionGame.getCreationDate())); 

// Fetching the data includes this:
try {
   java.util.Date creationDate = dateFormat.parse(cursor.getString(0);
   YourObject.setCreationDate(creationDate));
} catch (Exception e) {
   YourObject.setCreationDate(null);
}

通常(与我在mysql/postgres中所做的一样),我将日期存储在int(mysql/post)或文本(sqlite)中,以时间戳格式存储它们。

然后,我将它们转换为日期对象,并根据用户时区执行操作

As presumed in this comment, I'd always use integers to store dates. For storing, you could use a utility method public static Long persistDate(Date date) { if (date != null) { return date.getTime(); } return null; } like so: ContentValues values = new ContentValues(); values.put(COLUMN_NAME, persistDate(entity.getDate())); long id = db.insertOrThrow(TABLE_NAME, null, values); Another utility method takes care of the loading public static Date loadDate(Cursor cursor, int index) { if (cursor.isNull(index)) { return null; } return new Date(cursor.getLong(index)); } can be used like this: entity.setDate(loadDate(cursor, INDEX)); Ordering by date is simple SQL ORDER clause (because we have a numeric column). The following will order descending (that is newest date goes first): public static final String QUERY = "SELECT table._id, table.dateCol FROM table ORDER BY table.dateCol DESC"; //... Cursor cursor = rawQuery(QUERY, null); cursor.moveToFirst(); while (!cursor.isAfterLast()) { // Process results }

始终确保存储UTC/GMT时间,特别是在使用java.util.Calendar和java.text.SimpleDateFormat使用默认(即您的设备的)时区时。 使用java.util.Date.Date()是安全的,因为它创建了一个UTC值。

1 -就像StErMi说的。

2 -请阅读:http://www.vogella.de/articles/AndroidSQLite/article.html

3 -

Cursor cursor = db.query(TABLE_NAME, new String[] {"_id", "title", "title_raw", "timestamp"}, 
                "//** YOUR REQUEST**//", null, null, "timestamp", null);

在这里看到的:

查询()在SQLiteDatabase

4 -见答案3