Я реализую поставщика контента, который поддерживается довольно сложной схемой базы данных SQLite. В базе данных есть несколько соединительных таблиц, и я не уверен, должны ли они быть видны пользователю контент-провайдера или нет.
Родительские таблицы доступны через Contract
, каждая из них имеет свой собственный URI содержимого и т. д. Теперь при вставке данных с помощью метода ContentResolver#applyBatch()
я создаю ContentProviderOperation
для каждого URI содержимого таблицы. Пока все ясно. Но моя проблема в том, как должны быть заполнены соединительные таблицы, поскольку у них нет собственных URI контента?
Чтобы проиллюстрировать это, вот пример. У меня есть 2 "родительские" таблицы, Movies
и Actors
. Между ними существует связь «многие ко многим», поэтому у меня есть соединительная таблица с именем MoviesActors
.
Чтобы вставить в одну партию, я делаю следующее:
List<ContentProviderOperation> operations = new ArrayList<>;
// movie
operations.add(ContentProviderOperation.newInsert(Contract.Movie.ContentUri).withValue("movie_id", "23asd2kwe0231123sa").build());
// actor
operations.add(ContentProviderOperation.newInsert(Contract.Actor.ContentUri).withValue("actor_id", "89asd02kjlwe081231a").build());
getContentResolver().applyBatch(authority, operations);
Таблица соединений MoviesActors
должна быть вставлена со строкой, содержащей movie_id
и actor_id
. Как мне позаботиться о соединительной таблице в этой ситуации?
Единственное, что приходит мне на ум, это расширить Контракт, чтобы URI контента указывал на соединительные таблицы, и добавить еще один ContentProviderOperation
, иначе как вы связываете movie_id
и actor_id
с ContentProvider#applyBatch()
?
Я предпочитаю не показывать соединительную таблицу пользователю ContentProvider, но здесь я могу ошибаться... возможно, именно так это должно быть сделано на Android?
Я искал эту тему уже несколько дней и не нашел ответа на этот вопрос. Любая помощь будет принята с благодарностью.
Дополнительный вопрос:
Нужно ли выставлять каждую таблицу через контракт? Например, при наличии дочерних таблиц в отношениях «один ко многим». Я специально имею в виду Insert/Update/Delete, так как знаю, что с Query я могу просто выполнить соединение, но, возможно, я ошибаюсь и здесь.
Большое спасибо!
ПРИМЕЧАНИЕ. Меня не интересуют решения сторонних библиотек.