从Content Provider获取当前日期数据

时间:2014-08-20 08:34:17

标签: android sqlite android-contentprovider android-cursorloader

我必须根据当前月份从ContentProvider获取数据。为了获取数据,我使用了以下查询:

SELECT * FROM Festivals
WHERE strftime('%Y-%m-%d',fest_date) >= date('now','-6 days') AND
strftime('%Y-%m-%d',fest_date)<=date('now') order by fest_date

我尝试在CursorLoader中编写相同内容,如下所示:

new CursorLoader(this, FestivalContract.Festivals.CONTENT_URI, 
            PROJECTION, "strftime('%Y-%m-%d',fest_date)>=? AND strftime('%Y-%m-%d',fest_date)<=?", new String[] { "date('now','-6 days')", "date('now')" },
            FestivalContract.Festivals.FestivalColumns.FEST_NAME + " asc");

但是,它返回了所有记录。我无法找到代码中的错误。

2 个答案:

答案 0 :(得分:1)

您可以在内容提供程序中查询方法,如下所示:

SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
        // check if the caller has requested a column which does not exists
        checkColumns(projection);
        // Set the table
        queryBuilder.setTables(MessageTable.TABLE_NAME);
        int uriType = uriMatcher.match(uri);
        switch (uriType) {
            case MESSAGES:
                break;

            case MESSAGE_ID:
                // adding the ID to the original query
                queryBuilder.appendWhere(MessageTable.COLUMN_ID + "=" + uri.getLastPathSegment());
                break;

            case BROADCAST_MESSAGES:
                groupBy = MessageTable.COLUMN_MESSAGE_ID;
                break;

            default:
                throw new IllegalArgumentException("Unknow URI: " + uri);

如果你使用queryBuilder无法实现你的目标。 您有两种解决方法:

1-以长格式在数据库中存储日期。例如,您的节日日期是unix格式化日期,这意味着您应该将每个日期作为长号存储在数据库中。然后在cursorloader中写你的查询,如下所示:

new CursorLoader(this, FestivalContract.Festivals.CONTENT_URI, 
        PROJECTION, "fest_date>=? AND fest_date<=?", new String[] { System.currentTimeMillis(), System.currentTimeMillis() - 6 * 24 * 3600 * 1000)", "" },
        FestivalContract.Festivals.FestivalColumns.FEST_NAME + " asc");

2-第二个解决方案是自定义ContentProvider并为您要进行此特殊查询添加不同的Content_Uri,然后在提供商的query方法中检查是否你正在查询这个特殊的uri,然后不使用不允许你运行sql方法的QueryBuilder,而只是在内容提供者的数据库对象上执行你的查询字符串,如下所示:

return database.rawQuery(your_query_string_with_sql_methods, new String['your_params_or_whatever]);

答案 1 :(得分:0)

参数(?)用于您不想执行的字符串。

但是你想要执行date函数。只需将它们直接放入SQL查询中即可。