Android ContentObsrver для изменения одной строки

#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 для наблюдателя.