#android #sqlite #android-sqlite
#Android #sqlite #android-sqlite
Вопрос:
Я создаю приложение и использую SQLite для базы данных, но я никогда не использовал класс базы данных.
Я пытаюсь выяснить, как организовать следующую информацию:
Класс пользователя: имеет имя, два целочисленных поля и СПИСОК групп,
Класс группы: имеет имя, двойное поле и СПИСОК пользователей
Пользователь также в конечном итоге должен будет иметь какое-то поле аутентификации (имя пользователя / пароль), но я планирую разобраться с этим позже.
Если бы вы могли помочь мне продумать, как организовать эту информацию в SQLite, это было бы здорово.
Комментарии:
1. Кстати, хранить пароли в виде открытого текста не рекомендуется. Я понимаю, что вы только учитесь, но если вы хотите сделать это «правильно», посмотрите, как не хранить пароли для краткого обзора.
Ответ №1:
Таблицы могут быть организованы следующим образом,
Таблица User_tbl
--------------------------------------------------
_ID int primary key
--------------------------------------------------
name text name of user
--------------------------------------------------
field1 int int field 1
--------------------------------------------------
field2 int int field 2
--------------------------------------------------
Таблица Group_tbl
--------------------------------------------------
_ID int primary key
--------------------------------------------------
name text name of group
--------------------------------------------------
field double double field
--------------------------------------------------
Согласно ответу @cricket_007s, вам нужна другая таблица, которая связывает оба этих поля,
Таблица User_groups_tbl
--------------------------------------------------
_ID int primary key
--------------------------------------------------
user_id int _ID value from User_tbl
--------------------------------------------------
group_id int _ID value from Group_tbl
--------------------------------------------------
INNER JOIN
Запрос типа,
SELECT User_tbl._ID, User_tbl.name, Group_tbl._ID, Group_tbl.name, User_groups_tbl.user_id, User_groups_tbl.group_id
FROM User_tbl, Group_tbl, User_groups_tbl
INNER JOIN User_tbl.User_tbl._ID ON User_groups_tbl.User_groups_tbl.user_id
INNER JOIN Group_tbl.Group_tbl._ID ON User_groups_tbl.User_groups_tbl.group_id
WHERE User_groups_tbl.user_id = user_id;
выдаст все группы, в которых находится пользователь.
Аналогично INNER JOIN
запрос типа,
SELECT User_tbl._ID, User_tbl.name, Group_tbl._ID, Group_tbl.name, User_groups_tbl.user_id, User_groups_tbl.group_id
FROM User_tbl, Group_tbl, User_groups_tbl
INNER JOIN User_tbl.User_tbl._ID ON User_groups_tbl.User_groups_tbl.user_id
INNER JOIN Group_tbl.Group_tbl._ID ON User_groups_tbl.User_groups_tbl.group_id
WHERE User_groups_tbl.group_id = group_id;
выдаст всех пользователей в группе a.
Объяснение для User_groups_tbl
Эта таблица используется для хранения many-to-many
взаимосвязи между двумя таблицами User_tbl
и Group_tbl
. Когда пользователь добавляется в новую группу или наоборот, добавьте запись с _ID
соответствующей группой и _ID
соответствующим пользователем в этой таблице.
Комментарии:
1. Я думаю… Но это плохой дизайн. Как бы вы нашли информацию обо всех пользователях группы из списка, разделенного запятыми? Кроме разделения строки и запроса отдельных идентификаторов?
2. Думаю, потребуется работа. Могу ли я изменить в соответствии с вашим ответом?
3. @cricket_007 Пожалуйста, проверьте 🙂
4. Выглядит неплохо, хотя я бы добавил запрос ОБЪЕДИНЕНИЯ, чтобы получить все имена пользователей в группе
5. Меня немного смущает User_groups_tbl. Не могли бы вы привести мне пример того, как это использовать?
Ответ №2:
Насколько я понимаю, две таблицы образуют много-много отношений. Итак, «хороший» дизайн базы данных будет иметь 3 таблицы.
Таблица 1 (Пользователь): идентификатор пользователя (первичный ключ), имя, field_1, field_2
Таблица 2 (Группа): group_ID (первичный ключ), имя, double_Field
Таблица 3 (Взаимосвязь): user_ID (внешний ключ), group_ID (внешний ключ).
Ответ №3:
Если я правильно понял вопрос, вам нужно разобраться с many-many
отношениями между пользователем и группой. С помощью SQLite действительно сложно обрабатывать такие отношения. Я рекомендую вам использовать ORM
для этого Android, например Realm Android, который быстрее, чем sqlite, и идеально подходит для ваших нужд. Для многих-многих отношений создайте свои модели как https://realm.io/docs/java/latest/#many-to-many
Комментарии:
1. Итак, вы рекомендуете Realm поверх SQLite? Я думаю, это был лучший первоначальный вопрос. Может ли Realm также обрабатывать аутентификацию по имени пользователя / паролю позже?
2. Да, почему бы и нет? Я не пробовал это с
Android
. Но я использовалORM
для аутентификации в Интернете. Вам нужно сначала выполнить поиск имени пользователя, используя модель пользователя, а затем, если он найден, сопоставить парольif(user.getPassword().equal(input_password))
сauthenticate
именем пользователя.3. Отлично! Я изучу это.
Ответ №4:
Вы могли бы пойти в Codecademy и пройти курс SQL. Или вы можете использовать Realm или Cupboard или ActiveAndroid (есть несколько библиотек для облегчения разработки SQLite). И, если вы не знакомы с написанием кода SQL, то лучше всего использовать один из них.
В принципе, у вас будет таблица пользователей, таблица групп, затем таблица поиска группы пользователей (2 столбца), в которой перечислены значения идентификаторов, идентификаторы которых принадлежат идентификаторам группы.
Это можно рассматривать как отношение «многие ко многим«.