Обновление заметки после ее создания - PullRequest
0 голосов
/ 08 января 2020

В настоящее время я работаю над приложением для заметок, которое следует архитектуре MVVM. Есть 2 вида деятельности. Основной со списком заметок и режим просмотра, который позволяет пользователю просматривать заметки. Если они нажимают на описание или заголовок, он позволяет режим редактирования, где вы можете сохранить изменения, а что нет. Когда создается новая заметка, пользователь переводит заметки на одно и то же действие и включает режим редактирования с пустым заголовком и описанием. Проблема, с которой я столкнулся на данный момент, состоит в том, что если пользователь создает заметку и решает редактировать ее сразу после ее создания, когда пользователь возвращается к списку заметок, у него есть куча заметок, каждая из которых содержит каждое обновление, которое он сделал, поэтому заметка сохраняется в новую заметку вместо обновления существующей.

Код для сохранения заметки:

private void saveNote(){

        //updates existing note. Next Statement adds new note
        if(getIntent().hasExtra(EXTRA_ID)){
            mViewTitle.setText(mEditTitle.getText().toString());
            String timeStamp = Utility.getCurrentTimestamp();
            timeStamp = timeStamp.replace("-", " ");

            Note note = new Note(mTitle, mContent, timeStamp);
            note.setId(mID);
            mAddEditNoteViewModel.update(note);
            Toast.makeText(this, "Note Updated", Toast.LENGTH_SHORT).show();
        } else if(!getIntent().hasExtra(EXTRA_ID)){
            mViewTitle.setText(mEditTitle.getText().toString());
            String timeStamp = Utility.getCurrentTimestamp();
            timeStamp = timeStamp.replace("-", " ");

            Note note = new Note(mTitle, mContent, timeStamp);
            mAddEditNoteViewModel.insert(note);
            Toast.makeText(this, "New Note Created:", Toast.LENGTH_SHORT).show();
        }
    }

, как вы можете видеть, я проверяю, нужно ли мне обновить или создать новую заметку, проверяя, есть ли у намерения нужные мне данные (в этом случае идентификатор). Но когда пользователь только что создал заметку и не go вернулся к основному действию, каждый раз, когда вновь создаваемая заметка обновляется без возврата к основному, вызывается оператор else if, создавая, таким образом, новую заметку. Я не могу найти способ обойти это. Я думал только о сохранении новой заметки ПОСЛЕ того, как пользователь возвращается к основному действию, но если пользователь создает заметку, нажимает значок галочки (чтобы сохранить) и закрывает приложение, не возвращаясь к основной, заметка не будет сохранены. Как я могу подойти к этой проблеме?

Ответы [ 2 ]

0 голосов
/ 11 января 2020

Мне удалось получить желаемый результат, выполнив следующее:

в моем хранилище, я возвращаю long с помощью метода get, который возвращает идентификатор, возвращаемый в методе doInBackground асинхронной задачи, и в отличие от до (где do в фоновом режиме происходило после доставки результатов вставки (null)), результат не доставляется до выполнения doInBackground:

 public Long insert(Note note) {
        try {
            Long id = new InsertNoteAsyncTask(mNoteDao).execute(note).get();
            Log.d(TAG, "insert: CALLED - REPOSITORY - LONG: " + id);
            return id;
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;
    }

, тогда модель представления просто получает и возвращает длинную

public Long insert(Note note) {
    return mNoteRepository.insert(note);
}

и все работает как положено. Большое спасибо @ Tenfour04 за помощь

0 голосов
/ 08 января 2020

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

Но что действительно означает наличие EXTRA_ID, так это то, что Activity был открыт с инструкцией для загрузки существующего идентификатора.

Так что это не два эквивалентных значения, и вам не следует использовать EXTRA_ID в качестве теста на предмет сохранения новой заметки.

Есть много способов решить эту проблему. Я хотел бы изменить mID на mSavedNoteId и сделать его обнуляемым Integer или Long вместо int или long. (Не уверен, какой вы используете.) Пусть значение null указывает, что вы не работаете с сохраненной заметкой. Когда действие открывается, вы можете присвоить значение mSavedNoteId на основе дополнительного или оставить его как null, если дополнительного нет. Создайте идентификационный номер только и присвойте его mSavedNoteId при первом его сохранении. И, наконец, ваш оператор if может проверить, является ли mSavedNoteId нулевым или нет, чтобы определить, следует ли сохранять новую заметку или обновлять существующую.

private void saveNote() {
    mViewTitle.setText(mEditTitle.getText().toString());
    String timeStamp = Utility.getCurrentTimestamp().replace("-", " ");
    Note note = new Note(mTitle, mContent, timeStamp);
    if (mSavedNoteId != null){
        note.setId(mSavedNoteId);
        mAddEditNoteViewModel.update(note);
        Toast.makeText(this, "Note Updated", Toast.LENGTH_SHORT).show();
    } else {
        mSavedNoteId = generateNewNoteId(); // however you're doing it
        note.setId(mSavedNoteId);
        mAddEditNoteViewModel.insert(note);
        Toast.makeText(this, "Note Updated", Toast.LENGTH_SHORT).show();
    } 
}

Я полагаю, что, возможно, ваша реализация модели представления генерирует идентификатор при звонке insert(). В этом случае, сделайте insert(), верните сгенерированный идентификатор и измените ветку else так:

mSavedNoteId = mAddEditNoteViewModel.insert(note);
Toast.makeText(this, "Note Updated", Toast.LENGTH_SHORT).show();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...