我必须根据当前月份从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");
但是,它返回了所有记录。我无法找到代码中的错误。
答案 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查询中即可。