Отображение нескольких предложений для данной категории в базе данных SQLite
Я разрабатываю цитату приложения и использую локальную базу данных для импорта цитат. У меня есть проблема здесь, как вы можете видеть на картинке, я хочу поместить несколько цитат в один заголовок.
Например, заголовок "Жизнь", когда я щелкнул его в приложении, показывает только одну цитату. Я хочу, чтобы он показал мне цитату, а затем я перехожу к другой.
1 ответ
Вам нужно несколько таблиц, и чтобы придерживаться нормализации (сводя данные к минимуму), вам нужно 4 таблицы.
Таблица для названий. Таблица для самих цитат. Таблица для авторов (например, вместо повторения "Махатма Ганди"). Таблица, которая отображает / ссылается на заголовки и кавычки (позволяя связать многие со многими).
Таблице заголовков потребуется два столбца; - один для его идентификатора (примечание _id было использовано, так как это потенциально может потребоваться в качестве имени столбца для Android). - один для самого названия.
Таблице цитаты потребуется три столбца; - один для его id (снова _id). - один для самой цитаты. - один для ссылки на идентификатор таблицы автора
Таблице автора потребуется два столбца; - один для его id (снова _id). - один для автора.
Последняя таблица (title_quote_reference) нуждается в двух столбцах - один для ссылки на заголовок - один для ссылки на цитату
Следующее может быть использовано для построения вышеприведенных таблиц, их заполнения и выполнения базового запроса, который отображает все содержимое (если речь идет о удобных для пользователя данных (т. Е. Идентификаторы / ссылки не будут ничего значить / мало для пользователя):-
DROP TABLE IF EXISTS title_quote_map;
DROP TABLE IF EXISTS quote;
DROP TABLE IF EXISTS author;
DROP TABLE IF EXISTS title;
CREATE TABLE IF NOT EXISTS author (_id INTEGER PRIMARY KEY, author TEXT UNIQUE);
CREATE TABLE IF NOT EXISTS title (_id INTEGER PRIMARY KEY, title TEXT UNIQUE);
CREATE TABLE IF NOT EXISTS quote (_id INTEGER PRIMARY KEY, quote TEXT UNIQUE, author_reference INTEGER REFERENCES author(_id));
CREATE TABLE IF NOT EXISTS title_quote_map (
title_reference INTEGER REFERENCES title(_id),
quote_reference INTEGER REFERENCES quote(_id),
UNIQUE (title_reference, quote_reference));
INSERT INTO title (title) VALUES
('Life'),
('Happiness'),
('Positivity'),
('Famous Quotes'),
('Friendship'),
('Love'),
('Family'),
('Motivation')
;
INSERT INTO author (author) VALUES
('Leonardo da-Vinci'),
('Mahatma Ghandi'),
('Winston Churchill'),
('anon')
;
INSERT INTO quote (quote,author_reference) VALUES
('Life is my message.',2),
('Not how long, but how well you have lived.',4),
('Never in the field of human combat have so many owed so much to so few',3),
('I love those who can smile in trouble',1)
;
INSERT INTO title_quote_map VALUES
(1,1),(1,2),(1,4), -- Life quotes
(2,2),(2,4), -- Happiness quotes
(3,1),(3,2),(3,4), -- Positivity quotes
(4,1),(4,3),(4,4), -- Famous quotes
(6,4), -- Love quotes
(8,1),(8,2),(8,4)
;
SELECT quote.quote, title.title, author.author
FROM title_quote_map
JOIN title ON title._id = title_quote_map.title_reference
JOIN quote ON quote._id = title_quote_map.quote_reference
JOIN author ON author._id = quote.author_reference
;
Выполнение вышеизложенного приведет / должно привести к сообщениям следующего содержания:
DROP TABLE IF EXISTS title_quote_map
> OK
> Time: 0.622s
DROP TABLE IF EXISTS quote
> OK
> Time: 0.358s
DROP TABLE IF EXISTS author
> OK
> Time: 0.359s
DROP TABLE IF EXISTS title
> OK
> Time: 0.282s
CREATE TABLE IF NOT EXISTS author (_id INTEGER PRIMARY KEY, author TEXT UNIQUE)
> OK
> Time: 0.242s
CREATE TABLE IF NOT EXISTS title (_id INTEGER PRIMARY KEY, title TEXT UNIQUE)
> OK
> Time: 0.307s
CREATE TABLE IF NOT EXISTS quote (_id INTEGER PRIMARY KEY, quote TEXT UNIQUE, author_reference INTEGER REFERENCES author(_id))
> OK
> Time: 0.642s
CREATE TABLE IF NOT EXISTS title_quote_map (
title_reference INTEGER REFERENCES title(_id),
quote_reference INTEGER REFERENCES quote(_id),
UNIQUE (title_reference, quote_reference))
> OK
> Time: 0.307s
INSERT INTO title (title) VALUES
('Life'),
('Happiness'),
('Positivity'),
('Famous Quotes'),
('Friendship'),
('Love'),
('Family'),
('Motivation')
> Affected rows: 8
> Time: 0.34s
INSERT INTO author (author) VALUES
('Leonardo da-Vinci'),
('Mahatma Ghandi'),
('Winston Churchill'),
('anon')
> Affected rows: 4
> Time: 0.276s
INSERT INTO quote (quote,author_reference) VALUES
('Life is my message.',2),
('Not how long, but how well you have lived.',4),
('Never in the field of human combat have so many owed so much to so few',3),
('I love those who can smile in trouble',1)
> Affected rows: 4
> Time: 0.24s
INSERT INTO title_quote_map VALUES
(1,1),(1,2),(1,4), -- Life quotes
(2,2),(2,4), -- Happiness quotes
(3,1),(3,2),(3,4), -- Postivity quotes
(4,1),(4,3),(4,4), -- Famout quotes
(6,4), -- Love quotes
(8,1),(8,2),(8,4)
> Affected rows: 15
> Time: 0.242s
SELECT quote.quote, title.title, author.author
FROM title_quote_map
JOIN title ON title._id = title_quote_map.title_reference
JOIN quote ON quote._id = title_quote_map.quote_reference
JOIN author ON author._id = quote.author_reference
> OK
> Time: 0s
Результатом запроса будет:
Как видите, заголовок может иметь несколько кавычек, а цитата также может иметь несколько заголовков.
Вы можете изменить запрос так:
SELECT quote.quote, title.title, author.author
FROM title_quote_map
JOIN title ON title._id = title_quote_map.title_reference
JOIN quote ON quote._id = title_quote_map.quote_reference
JOIN author ON author._id = quote.author_reference
ORDER BY random()
LIMIT 1
;
Затем будет выбрана случайная цитата, например, для цитаты дня, например.
- Обратите внимание, что приведенное выше включает в себя внешние ключи, они должны быть включены при использовании собственного SQLite для Android с использованием / выполнением SQL "PRAGMA foreign_keys=ON;" (в методе onOpen или onConfigure). Там нет фактической необходимости иметь
REFERENCES ...
так что они могут быть удалены или проигнорированы, если вы не хотите включать внешние ключи.