Ответы пользователя по тегу ООП
  • Как правильно организовать хранение объектов в Android приложении?

    AlPsc
    @AlPsc
    Java/high load/big data
    Во-первых, судя по вашему описанию предметной области задачи (всего один тип объектов, фиксированный набор атрибутов объекта), база данных – то, что вам нужно. Не надо бояться инициализации объектов, потому что способа избежать восстановления объекта из хранилища (какое бы оно ни было) в данном случае нет: храните в базе – придётся инициализировать объект значениями столбцов таблицы; храните, скажем, в JSON – придётся инициализировать объект значениями, полученными из JSON-объекта (что, кстати, ещё менее удобно); используете Java-сериализацию – и там тоже будут накладные расходы на восстановление объекта из формата, в котором вы его сохранили, ну и так далее. А БД – очень удобный формат. К тому же, никто вас не заставляет инициализировать все-все объекты на старте программы: если у пользователя очень много заметок, то можно просто подгружать новые по мере листания списка.
    Во-вторых, по поводу
    напоминания — это объекты, с которыми удобно было бы работать, непосредственно обращаясь к ним, вызывая методы

    Есть такая вещь, как single responsibility principleто же самое на русском), суть которой вкратце состоит в том, что класс должен выполнять только конкретный ограниченный круг обязанностей, и больше ничего. В данном случае ваша ошибка в том, что вы думаете о том, чтобы дать классу заметки обязанности, которые ему по идее не свойственны. Заметка в данном случае – просто сущность, отображающая хранимые данные, больше ничего, и она ничего не должна знать об уровне хранения и т.п. Так что методов типа delete(), save() и подобных у неё точно не должно быть. А вам для удобства хранения и загрузки объектов я предлагаю сделать отдельный класс типа такого (написано на коленке просто чтобы передать идею):
    public class NotesManager {
           private final SQLiteDatabase db;
    
           public NotesManager(SQLiteDatabase db) { this.db = db; }
    
           public Note findById(int noteId) {
                  Cursor c = db.query(...);
                  //тут чтение в локальные переменные значений
                  //отдельных полей из курсора,
                  //если он вернул какой-то результат
                  return new Note(...ранее считанные значения полей как аргументы конструктора...);
           }
    
           public void save(...перечисление полей...) {
                  //после проверки введённых данных делаете 
                  //insert в базу с переданными значениями полей 
           }
    }

    Также вам понадобятся методы create и delete, но если вы поняли идею, то наверняка справитесь :) Задавайте ещё вопросы, если что-то непонятно.
    Ответ написан
    6 комментариев