Проблемы с UriMatcher Android

В ответе на мой предыдущий вопрос кто-то указал, что есть некоторая нестабильность (из-за отсутствия лучшего слова), присущая 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: uriMatcher.match (uri)

В предыдущем вопросе (упомянутом ранее) мне было рекомендовано переместить вызывающий ошибку Uri в начало вызовов UriMatcher.put (String, int). Это решило предыдущую проблему (и оставило неприятный привкус во рту). Использование того же решения с этим кодом приводит к тому, что текущий первый Uri (JOBNAME_SINGLE_URI) становится нераспознанным. Я почти уверен, что проблема не в моем коде (мне удалось создать рабочий ContentProvider с использованием Uris и отладить все проблемы с ними до этой проблемы), а скорее проблема с сопоставлением Uri в Android .

ОБНОВЛЕНИЕ:

public final static String AUTHORITY = "dsndata.sds2mobile.jobprovider";

Пример Uri:
content: //dsndata.sds2mobile.jobprovider/SDS2MobileDemo/reverse/C_1

18
задан Lunchbox 24 March 2011 в 20:23
поделиться