我有一个 ConentProvider 并使用 UriMatcher 来执行适当的 SQL 语句。
代码有效,但我不喜欢从中提取参数的方式 uri 的:
这是失败的:
String badge_id = uri.getQueryParameter("id");
String badge_value = uri.getQueryParameter("badge");
,而且会很理想。
获取参数的正确/最佳方式是什么? 我的 uri 匹配器在工作吗?
电话:
Uri uri = Uri.parse("content://" + USERSSchema.AUTHORITY
+ "/" + USERSSchema.USERSTable.TABLE_USERS + "/id/" + String.valueOf(badgeId) + "/badge/" + String.valueOf(badgeValue));
getApplication().getApplicationContext().getContentResolver().update(uri,null,null,null);
接收者:
private static final int USERS_UPDATE_ORDER_BY_ID = 1;
private static final int USERS_CHANGE_ORDER_BY_ORDER = 2;
private static final int USERS_CHANGE_BADGE = 3;
uriMatcher.addURI(USERSSchema.AUTHORITY,USERSSchema.USERSTable.TABLE_USERS
+ "/from_id/#/to_id/#", USERS_UPDATE_ORDER_BY_ID);
uriMatcher.addURI(USERSSchema.AUTHORITY,USERSSchema.USERSTable.TABLE_USERS
+ "/from_order/#/to_order/#", USERS_CHANGE_ORDER_BY_ORDER);
uriMatcher.addURI(USERSSchema.AUTHORITY,USERSSchema.USERSTable.TABLE_USERS
+ "/id/#/badge/#", USERS_CHANGE_BADGE);
@Override
public int update(Uri uri, ContentValues contentValues, String selection, String[] selectionArgs) {
switch (uriMatcher.match(uri)) {
case USERS_UPDATE_ORDER_BY_ID :
// ....
break:
case USERS_CHANGE_ORDER_BY_ORDER:
// ....
break;
case USERS_CHANGE_BADGE :
String badge_id = uri.getQueryParameter("id");
String badge_value = uri.getQueryParameter("badge");
**//WHAT IS THE BETTER WAY?**
int badge_segment = 0;
for (String segment : uri.getPathSegments()) {
switch (badge_segment++) {
case 2 :
badge_id = segment;
break;
case 4 :
badge_value = segment;
break;
}
}
break;
最佳答案
看起来您混淆了传统意义上的查询参数,以及像 Symfony 这样的框架处理它们的方式。
Uri.getQueryParameter 查找查询字符串 (content://demo?key=value)。要从路径内部获取参数,请使用 Uri.getPathSegments()。
关于android - 将 UriMatcher 与 ConentProvider 一起使用时如何解析查询参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30935903/