Внедрявам доставчик на съдържание, който е подкрепен от доста сложна SQLite DB схема. Базата данни има няколко съединителни таблици и не съм сигурен дали те трябва да бъдат видими за потребителя на доставчика на съдържание или не.
Родителските таблици са изложени чрез 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 мога просто да направя присъединяване, но може би и тук греша.
Благодаря много!
ЗАБЕЛЕЖКА: Не се интересувам от библиотечни решения на трети страни.