0

簡単なメモを作ってみました。新しいメモの追加で保存をクリックすると、同じ内容の 2 つのメモとして保存されます。それは彼らが2回節約することを意味します。どうしてか分かりません。

noteadapter クラスでメモを作成します。

    public long createNote(String title, String body, String date) {
    ContentValues initialValues = new ContentValues();
    initialValues.put(KEY_TITLE, title);
    initialValues.put(KEY_BODY, body);
    initialValues.put(KEY_DATE, date);

    return mDb.insert(DATABASE_TABLE, null, initialValues);
}

notelist クラスで create note を呼び出します。

    private void createNote() {
    Intent i = new Intent(this, NoteEdit.class);
    startActivityForResult(i, ACTIVITY_CREATE);    

編集または削除ノートを追加するためのnoteeditクラスのイベント:

    mRowId = (savedInstanceState == null) ? null :
        (Long) savedInstanceState.getSerializable(NotesDbAdapter.KEY_ROWID);
    if (mRowId == null) {
        Bundle extras = getIntent().getExtras();
        mRowId = extras != null ? extras.getLong(NotesDbAdapter.KEY_ROWID)
                                : null;
    }

    populateFields();

}

    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.menu_about:
        case R.id.menu_delete:
            if(note != null){
                note.close();
                note = null;
            }
            if(mRowId != null){
                mDbHelper.deleteNote(mRowId);
            }
            finish();

            return true;
        case R.id.menu_save:
            saveState();
            finish();           
        default:
            return super.onOptionsItemSelected(item);
        }
    }

    private void saveState() {
        String title = mTitleText.getText().toString();
        String body = mBodyText.getText().toString();

        if(mRowId == null){
            mDbHelper.createNote(title, body, curDate);
        }else{
            mDbHelper.updateNote(mRowId, title, body, curDate);
        }
    }


    private void populateFields() {
        if (mRowId != null) {
            note = mDbHelper.fetchNote(mRowId);
            startManagingCursor(note);
            mTitleText.setText(note.getString(
                    note.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE)));
            mBodyText.setText(note.getString(
                    note.getColumnIndexOrThrow(NotesDbAdapter.KEY_BODY)));
            curText = note.getString(
                    note.getColumnIndexOrThrow(NotesDbAdapter.KEY_BODY));
        }
    }

行IDを取得しようとすると、ここで問題が発生する可能性があります:

mRowId = (savedInstanceState == null) ? null :
        (Long) savedInstanceState.getSerializable(NotesDbAdapter.KEY_ROWID);
    if (mRowId == null) {
        Bundle extras = getIntent().getExtras();
        mRowId = extras != null ? extras.getLong(NotesDbAdapter.KEY_ROWID)
                                : null;
    }

ここに私の完全なコード:

http://www.mediafire.com/download/w1kyy7spc522za9/Notepad.zip

4

1 に答える 1

0

あなたは、メモを保存してからアクティビティを保存するためにonOptionsItemSelected()呼び出しています。(その後、オプション項目の選択の処理を停止する必要がありますが、ここでは問題ではありません。) アクティビティが終了すると、一時停止状態になります。あなたは再び電話をかけます。が定義されているときにエントリを更新しますが、 でのみ設定するため、データベースに新しい行が作成されます。saveState()finish()return true;onPause()saveState()saveState()mRowIdonCreate()

解決策は、最初の挿入を行うときに挿入された行 ID をキャプチャして保存し、後で呼び出してsaveState()行を更新することです。db ヘルパーcreateNote()は、格納していない行 ID を既に返しています。

于 2013-09-15T19:24:17.813 に答える