#android #android-contentprovider #android-contentresolver
#Android #android-contentprovider #android-contentresolver
Вопрос:
Я хотел бы написать ContentObserver
для локальной таблицы моего приложения. Также мне нужно ContentProvider
получить доступ к таблице. Теперь в одном из моих действий я должен наблюдать за изменением только в одной строке этой таблицы. У меня есть первичный ключ для наблюдения за ним, но первичный ключ TEXT
не INTEGER
является. При поиске в Google я нашел информацию о получении определенных строк Uri
с помощью метода ContentUris.withAppendedId. Но для этого требуется идентификатор, который должен быть long(NUMBER)
. Итак, есть ли способ получить Uri
одну строку таблицы, когда идентификатор равен TEXT
?
Комментарии:
1. developer.android.com/reference/android/net /… , java.lang. Строка)
2. будет ли этот uri указывать на строку, которая имеет значение первичного ключа в качестве строкового значения, которое я передаю?
3. Поставщикам контента требуется столбец _id для ссылки на строки (или для правильной работы). Вы должны создать столбец _id и установить для него значение автоматического увеличения. Теперь вы можете использовать _id или URI для фильтрации строк. Посмотрите здесь: developer.android.com/guide/topics/providers /…
4. @Ram Uri может указывать на все, что вы хотите, это просто ваше воображение, как вы могли бы сопоставить части Uri в вашей модели данных
5. @Ayub нет, нет необходимости иметь столбец _id в поставщике контента
Ответ №1:
Из комментариев @pskink я нашел способ добиться этого и хотел бы поделиться им. В сопоставителе uri существующего поставщика контента мы должны добавить ‘/ *’ с новой записью следующим образом…
private static final String AUTH = "com.test.Provider";
public static final Uri TABLE_URI = Uri.parse("content://" AUTH "/"
TABLE_NAME);
public static final Uri TABLE_ID_URI = Uri.parse("content://" AUTH
"/" TABLE_NAME "/*");
final static int TABLE_COMMENT = 10;
final static int TABLE_ROW_COMMENT = 11;
uriMatcher.addURI(AUTH, TABLE_NAME, TABLE_COMMENT);
uriMatcher.addURI(AUTH, TABLE_NAME "/*", TABLE_ROW_COMMENT);
И в методе запроса следующим образом…
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String orderBy) {
db = dbManager.getReadableDatabase();
Cursor cursor = null;
switch (uriMatcher.match(uri)) {
case TABLE_COMMENT:
cursor = db.query(TABLE_NAME, projection, selection,selectionArgs, null, null, orderBy);
if (cursor != null)
cursor.setNotificationUri(getContext().getContentResolver(),uri);
break;
case TABLE_ROW_COMMENT:
String id = uri.getLastPathSegment();//getting the PK
cursor = db.query(TABLE_NAME, projection,Table._ID "=?", new String[] { id },null, null, orderBy);
if (cursor != null)
cursor.setNotificationUri(getContext().getContentResolver(),uri);
break;
}
return cursor;
}
И из действия или фрагмента можно получить uri конкретной строки из загрузчика следующим образом…
Uri uri = Uri.withAppendedPath(Provider.TABLE_URI,
"pk value");
Cursor cursor = getContentResolver().query(uri, null, null, null,
null);
И в моем случае я буду использовать этот Uri для наблюдателя.