сохранение объекта для приложения в Android, или это вообще правильный подход

#java #android

#java #Android

Вопрос:

Итак, у меня есть некоторый очень незначительный опыт работы с Java, и я пытаюсь учиться / работать над проектом Android. Проблема, с которой я сталкиваюсь, заключается в том, что я обдумываю сохранение / извлечение пользовательских данных.

Это простое приложение для разметки (в основном для меня), но в основном есть объект semester, который содержит объекты classes, который содержит помечаемые объекты (т. Е. Проверяет каждый со своим собственным весом).

Итак, по сути, я спрашиваю, как бы мне получить данные.. Чего я действительно хочу, так это отображать «О, привет, это ваша оценка за текущий семестр»: когда вы открываете основное действие / запускаете приложение (что включало бы загрузку объекта semester, в который пользователь ввел свои данные, и вызов метода), но я не знаю, как я буду открывать / сохранять объекты каждый раз, когда приложение открывается и закрывается.

Буду ли я реализовывать сериализацию в классе semester’а, или я буду сохранять / открывать объект всякий раз, когда я закрываю / открываю приложение. Является ли сохранение объекта semester вообще правильным подходом?

Я некоторое время искал и видел вопросы о людях, открывающих файлы, и сейчас я совершенно потерян.

(О, и раз уж я затронул тему этого проекта, является ли идея вложенности объектов плохим подходом? Например, объект semester, который содержит несколько объектов класса, каждый из которых содержит несколько помечаемых объектов)

Ответ №1:

Это простое приложение для разметки (в основном для меня), но в основном есть объект semester, который содержит объекты classes, который содержит помечаемые объекты (т. Е. Проверяет каждый со своим собственным весом).

Эти объекты были бы хорошими кандидатами для хранения в отдельных таблицах в базе данных SQLite.

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

Вы можете расширить Application класс и поместить в его onCreate() любой код, который вы хотите запустить только один раз при первоначальном запуске приложения.

И в onCreate() вашего основного действия вы также можете разместить код для отображения данных каждый раз, когда пользователь переходит к этому действию.

Буду ли я реализовывать сериализацию в классе semester’а, или я буду сохранять / открывать объект всякий раз, когда я закрываю / открываю приложение. Является ли сохранение объекта semester вообще правильным подходом?

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

(О, и раз уж я затронул тему этого проекта, является ли идея вложенности объектов плохим подходом? Например, объект semester, который содержит несколько объектов класса, каждый из которых содержит несколько помечаемых объектов)

Нет, если это имеет смысл. У вас мог бы быть, например, объект Semester, который содержит в качестве члена ArrayList объектов класса.

Ответ №2:

  1. Gson можно использовать для объектной (де) сериализации между объектами и строкой json, которая может быть сохранена в файле.

    Сериализация Gson (де) также может обрабатывать вложенные объекты, если эти объекты также сериализуются с помощью Gson.

    Однако использование Gson будет означать, что вам нужно будет реализовать сохранение в файл и извлечение из него позже. (Хотя здесь есть множество вопросов / ответов на Android, которые должны помочь)

  2. Если ваши объекты достаточно просты и содержат только примитивные данные, такие как строки и числовые значения, вы могли бы хранить / извлекать их в базе данных с помощью реализации Android на SQL.

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

Ответ №3:

Используйте базу данных SQLite для хранения всей информации о субъектах, т.Е. Subject object.

Реализация всех операций CRUD с базой данных решит большинство ваших проблем.

Смотрите здесь

Пример добавления объекта в базу данных

     public void addSubject(Subject sub) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_NAME, sub.getSubjectName()); // Subject Name
        values.put(KEY_MARK, sub.getMark()); // Subject Mark
        values.put(KEY_SEMSTER, sub.getSemster()); // Semester subject is marked 

        // Inserting Row
        db.insert(TABLE_SUBJECT, null, values);
        db.close(); // Closing database connection
    }
  

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

Это может быть немного сложно для новичка в Java, но есть много примеров, с которых можно начать, и вы всегда можете найти помощь здесь. Не волнуйтесь, исследуйте.

Комментарии:

1. Весь смысл этого проекта состоял в том, чтобы я чувствовал себя некомфортно и был вынужден изучать новые вещи, поэтому я взгляну на SQLite и посмотрю, смогу ли я заставить это работать. Спасибо.

2. Как вы думаете, было бы лучше реализовать базу данных SQLite для каждого класса, а также для каждого семестра, т. е. База данных класса будет содержать информацию об отдельных помечаемых объектах, а семестр будет содержать информацию о классе.

3. @user3697131 Структурирование и проектирование базы данных может быть настолько сложным, что на самом деле это сама область компьютерных наук. Существует множество способов структурирования базы данных для достижения того, чего вы хотите. Я предположу, что у вас есть одна база данных, но 2 таблицы.