Объединение нескольких таблиц в SQLite - Book Reader - PullRequest
0 голосов
/ 08 октября 2018

Я занят приложением для чтения книг только для чтения, которое имеет одну базу данных и 3 таблицы.Одна таблица называется главы, где главы имеют имена, одна таблица называется подглавами, где главы являются числами, и одна таблица называется записями, которая является текстовым содержимым таблицы подглав.Каждая запись будет иметь номер тоже для лучшей организации.

таблица глав имеет два столбца: идентификатор и имя

таблица подглав содержит два столбца: идентификатор и номер

записейТаблица имеет два столбца: идентификатор и текст

Я сгенерировал запрос для извлечения произвольной текстовой записи из таблицы записей в начале действия, и он работает нормально.Однако мне нужны две вещи:

  1. Когда случайный текст отображается на экране активности в представлении, мне нужно дать ему не только текст, но и название главы и номер подглавы какхорошо.

  2. Когда щелкают по этому представлению, мне нужно, чтобы он отвел пользователя к подразделу, из которого пришел этот текст, откуда пользователь может затем читать и / или перемещаться и т. д.

Проблема, с которой я столкнулся, заключается в том, что мне нужно, чтобы приложение знало, из какой главы, подглавы и записи получен случайный текстовый ввод, чтобы оно могло отобразить его и затем перевести пользователя туда.нажмите.

Я знаю, что это связано с JOIN, и я просмотрел много уроков и прочитал много постов здесь, но я не видел ничего похожего на то, о чем я говорю, или я просто не понимаю этого, видя другиенесвязанные примеры.

Это мой текущий rawQuery для получения произвольной текстовой записи:

public List<String> getRandomTextEntry() {
    List<String> list = new ArrayList<>();
    Cursor cursor = database.rawQuery("SELECT * FROM entries ORDER BY 
RANDOM() LIMIT 1", null);
    cursor.moveToFirst();
    while (!cursor.isAfterLast()) {
        list.add(cursor.getString(1));
        cursor.moveToNext();
    }
    cursor.close();
    return list;
}

Любая помощь с этим очень ценится.

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Мне нужно, чтобы приложение было в состоянии узнать, из какой главы, подглавы и записи произошла случайная текстовая запись

В описываемых вами таблицах не указано, какая глава или подраздел содержит записьони не могут ответить на ваш запрос.

PS

У вас может быть базовая таблица CSE, содержащая строки, в которых "запись главы C подраздела S - E".Затем вы можете выполнить поиск текста, используя таблицу для строк, в которых «запись главы C - это ИД, а ID записи - это ТЕКСТ И Е = ИД», которая выбрана * из записей внутреннего соединения CSE для Е = ИД.Но: CSE & Chapters и т. Д. Не могут содержать только какие-либо значения.Например, идентификаторы глав уникальны, то есть count (выберите ID из глав) = count (Chapters) - ограничение суперключа (SQL UNIQUE NOT NULL), кандидат на ограничение SQL PK (первичный ключ).Например, значения CSE C должны быть значениями идентификатора главы, т. Е. Выбрать C из CSE <= выбрать идентификатор как C из разделов - часть ограничения FK (внешний ключ).Например, если нет пустых глав, выберите C из CSE> = выберите ID как C. из глав.

Или у вас могут быть базовые таблицы CS "глава C содержит подглаву S" & SE "подглава S содержит запись E"поэтому CSE = CS естественное объединение SE.К сожалению, это требует множества других ограничений, которые сводятся к тому, что (удивительно) CSE = CS естественное объединение SE.

Вы не хотите использовать только одну базовую таблицу вместо CSE и остальные 3, потому что этоусложняет ограничение: каждый раз, когда появляется идентификатор главы, он имеет одно и то же имя, а каждый раз, когда появляется идентификатор подглавы, он с одним и тем же номером.

Это не означает, что CSE + ваши 3 таблицы - лучший дизайнили хороший дизайн.Я просто иллюстрирую, что вам нужно найти условия членства в строке таблицы (предикаты (характеристика) * ) и соответствующие базовые таблицы, необходимые и достаточные для описания ваших бизнес-ситуаций, и что выбор имеет последствия.

Время читать учебник по информационному моделированию, реляционной модели и дизайну базы данных.(Примечание: руководство по инструменту проектирования, API или языку для записи дизайнов не является руководством / руководством по дизайну.)

0 голосов
/ 08 октября 2018

Почему вы хотите использовать несколько таблиц?На мой взгляд, лучше иметь только одну таблицу со следующими столбцами: идентификатор, глава, подраздел и текст.Конечно, вы должны использовать одно и то же имя главы и, возможно, одни и те же номера подглавы несколько раз, но затем вы делаете запрос к текстовому столбцу, и в этом случае вы можете одновременно узнать, какая это глава и какая подглава.Этот учебник действительно хорошо описывает, как обрабатывать несколько столбцов: https://www.androidhive.info/2011/11/android-sqlite-database-tutorial/

Но если вы все еще хотите использовать несколько таблиц и «связать» их, я бы предложил следовать этому учебнику: https://www.androidhive.info/2013/09/android-sqlite-database-with-multiple-tables/ Этов основном делает то же самое, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...