- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在对我之前的问题的回答中,有人指出 Android 类 UriMatcher 中存在一些固有缺陷(因为没有更好的词)。任何人都可以查明 UriMatcher 的已知问题吗?我正在设计一个依赖 UriMatcher 正确匹配我的 Uris 的内容提供程序(而不是我想的不正确)。已知问题是否有解决方法?还是有更好的匹配 Uris 的策略?
例子:
这是设置我的 UriMatcher 的代码
private static final int MEMBER_COLLECTION_URI = 1;
private static final int MEMBER_SINGLE_URI = 2;
private static final int SUBMATERIAL_COLLECTION_URI = 3;
private static final int SUBMATERIAL_SINGLE_URI = 4;
private static final int JOBNAME_COLLECTION_URI = 5;
private static final int JOBNAME_SINGLE_URI = 6;
private static final int ALL_MEMBERS_URI = 7;
private static final int ALL_SUBMATERIAL_URI = 8;
static
{
//return the job and fab for anything matching the provided jobName
// JobNames/jobName
uriMatcher.addURI(JobMetaData.AUTHORITY, "JobNames/*/",
JOBNAME_SINGLE_URI);
//return a collection of members
// jobName/member/attribute/value
uriMatcher.addURI(JobMetaData.AUTHORITY, "*/member/*/*/",
MEMBER_COLLECTION_URI);
//return a single member
// jobName/member/memberNumber
uriMatcher.addURI(JobMetaData.AUTHORITY, "*/member/*/",
MEMBER_SINGLE_URI);
//return a collection of submaterial
// jobName/submaterial/attribute/value
uriMatcher.addURI(JobMetaData.AUTHORITY, "*/submaterial/*/*",
SUBMATERIAL_COLLECTION_URI);
//return a single piece of submaterial
// jobName/submaterial/GUID
//GUID is the only way to uniquely identify a piece of submaterial
uriMatcher.addURI(JobMetaData.AUTHORITY, "*/submaterial/*",
SUBMATERIAL_SINGLE_URI);
//Return everything in the member and submaterial tables
//that has the provided attribute that matches the provided value
// jobName/attribute/value
//not currently used
uriMatcher.addURI(JobMetaData.AUTHORITY, "JobNames/",
JOBNAME_COLLECTION_URI);
//return all members in a job
uriMatcher.addURI(JobMetaData.AUTHORITY, "*/members/",
ALL_MEMBERS_URI);
}
添加另一个 Uri:
private static final int MEMBER_COLLECTION_URI = 1;
private static final int MEMBER_SINGLE_URI = 2;
private static final int SUBMATERIAL_COLLECTION_URI = 3;
private static final int SUBMATERIAL_SINGLE_URI = 4;
private static final int JOBNAME_COLLECTION_URI = 5;
private static final int JOBNAME_SINGLE_URI = 6;
private static final int ALL_MEMBERS_URI = 7;
private static final int ALL_SUBMATERIAL_URI = 8;
//ADDITIONAL URI
private static final int REVERSE_URI = 9;
static
{
//return the job and fab for anything matching the provided jobName
// JobNames/jobName
uriMatcher.addURI(JobMetaData.AUTHORITY, "JobNames/*/",
JOBNAME_SINGLE_URI);
//return a collection of members
// jobName/member/attribute/value
uriMatcher.addURI(JobMetaData.AUTHORITY, "*/member/*/*/",
MEMBER_COLLECTION_URI);
//return a single member
// jobName/member/memberNumber
uriMatcher.addURI(JobMetaData.AUTHORITY, "*/member/*/",
MEMBER_SINGLE_URI);
//return a collection of submaterial
// jobName/submaterial/attribute/value
uriMatcher.addURI(JobMetaData.AUTHORITY, "*/submaterial/*/*",
SUBMATERIAL_COLLECTION_URI);
//return a single piece of submaterial
// jobName/submaterial/GUID
//GUID is the only way to uniquely identify a piece of submaterial
uriMatcher.addURI(JobMetaData.AUTHORITY, "*/submaterial/*",
SUBMATERIAL_SINGLE_URI);
//Return everything in the member and submaterial tables
//that has the provided attribute that matches the provided value
// jobName/attribute/value
//not currently used
uriMatcher.addURI(JobMetaData.AUTHORITY, "JobNames/",
JOBNAME_COLLECTION_URI);
//return all members in a job
uriMatcher.addURI(JobMetaData.AUTHORITY, "*/members/",
ALL_MEMBERS_URI);
//ADDITIONAL URI
uriMatcher.addURI(JobMetaData.AUTHORITY, "*/reverse/*",
REVERSE_URI);
}
最后一个 Uri 无法识别: uriMatcher.match(uri)
在上一个问题(前面提到过)中,建议我将有问题的 Uri 移到对 UriMatcher.put(String, int) 的调用的顶部。这解决了之前的问题(让我嘴里的味道不好)。使用此代码尝试相同的解决方案会导致当前的第一个 Uri (JOBNAME_SINGLE_URI) 无法识别。我相当确定问题不在我的代码中(我已经设法使用 Uris 创建了一个工作的 ContentProvider 并在此问题之前调试了它们的所有问题),而是 Android 中 Uri 匹配的问题.
更新:
public final static String AUTHORITY = "dsndata.sds2mobile.jobprovider";
示例 Uri:
content://dsndata.sds2mobile.jobprovider/SDS2MobileDemo/reverse/C_1
最佳答案
有三个规则没有很好的记录,但对于理解 UriMatcher 的匹配机制至关重要:
以下是一些使用以下网址的示例:content://dsndata.sds2mobile.jobprovider/SDS2MobileDemo/reverse/C_1
前两条规则很容易理解:
第三条规则有点难以理解。如果您按此确切顺序添加以下 Uris:
然后它将找不到匹配项,因为这会转换为以下(伪)代码:
if ("*".matches("SDS2MobileDemo")) {
// tries to match the other parts but fails
}
else if ("SDS2MobileDemo".matches("SDS2MobileDemo")) {
// will never be executed
}
如果你颠倒顺序,(伪)代码变成:
if ("SDS2MobileDemo".matches("SDS2MobileDemo")) {
// tries to match the other parts and succeeds
}
else if ("*".matches("SDS2MobileDemo")) {
// will never be executed
}
现在就最初的问题而言。SDS2MobileDemo/reverse/C_1 将与 */reverse/* 匹配,但不是例如JobNames/reverse/C_1 因为那个会沿着 JobNames/* 路径...同样很明显,将 */reverse/* 移到顶部不是解决方案,因为所有其他不以 * 开头的模式将不再匹配。只要不知道哪个模式应该匹配哪个 Uris,就真的不知道正确的解决方案是什么。
关于android - Android 的 UriMatcher 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5030094/
我有两个 Uris。假设他们是: content://myprovider/messages content://myprovider/messages/# 在我的扩展 ContentProvider
首先:我已经筛选了很多关于 SO 主题的问题,但仍然没有找到正确的答案。 这是我的代码的一个(简化的)版本: private static UriMatcher uriMatcher
我正在为 Android 应用程序创建内容提供程序,但我在使用 UriMatacher 正确匹配 uri 时遇到问题。 . 例如,我添加 uri 以匹配(从链接中截取) sURIMatcher.add
我有一个 ContentProvider,我需要匹配一些包含 UUID 作为通配符的 URI。 来自 ContentProvider 的 UriMatcher: public static final
UriMatcher(int code) 构造函数中的代码参数根据 Android Developer Document用于“匹配根 URI”,代码通常为 NO_MATCH其值等于 -1 我不清楚这个
这很有效!我不确定发生了什么变化。我确实使用 git,现在我已经检查了我的提交和代码几个小时。 如标题所示,我的 uri 匹配器已停止匹配。 下面我粘贴了我的内容提供者的相关部分。 public cl
我有这个 URI content://com.mycompany.data/routes?group=M01&office=BOCE&zone=EC01 还有这条规则 sUriMatcher.addU
我是 Android 新手。我浏览了 Android ContentProvider 的代码,我对 UriMatcher 有点困惑,因为 static 中的语句将首先执行。在 UriMatcher 内
我对内容提供者有疑问。 每次我编写内容提供程序时,我都会将 URI MATCHER 定义放在静态括号中,但 URI MATCHER 被声明为该类的私有(private)数据成员。只有 definiti
我正在尝试为搜索对话框提供自定义建议。我正在使用 urimatcher 来匹配 uri。但它不起作用。我总是得到异常“java.lang.IllegalArgumentException: Unkno
我想使用 UriMatcher匹配自定义 http 链接。 我有以下代码: UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
我有一个为 ShareActionProvider 执行后台处理的自定义 ContentProvider。提供的 Uri 路径是完整的文件路径(例如:/mnt/sdcard/my.file)。 uri
我正在尝试根据几个示例实现我自己的 ContentProvider,但我对 UriMAtcher 中的不同方法感到困惑。例如: JavaDoc用 # 显示它,如下所示: sURIMatcher.add
我的任务是设计我的 Web 服务客户端代码以使用 Android SDK 中的实用程序类 UriMatcher。不幸的是,开发指南中的示例与我的想法无关。我知道我遗漏了一些关于功能的基本要点,可能还有
android.content.UriMatcher中的Uri Matcher是什么 如何使用它?有人可以解释一下以下三行代码的含义吗? uriMatcher = new UriMatcher(U
在对我之前的问题的回答中,有人指出 Android 类 UriMatcher 中存在一些固有缺陷(因为没有更好的词)。任何人都可以查明 UriMatcher 的已知问题吗?我正在设计一个依赖 UriM
我有一个 ConentProvider 并使用 UriMatcher 来执行适当的SQL 语句。 代码有效,但我不喜欢从中提取参数的方式uri 的: 这是失败的: String badge_id =
我看到的关于如何制作 ContentProvider 的示例都用过UriMatcher#match(Uri) insert、query、update 和 delete 方法中的方法可以轻松处理所有 U
我是一名优秀的程序员,十分优秀!