在SQLite更新操作之后刷新ListView

时间:2016-11-03 06:04:32

标签: android sqlite

使用CRUD操作创建记事本应用程序。

我正在尝试更新包含备注标题的ListView项目,并点击打开相应的备注。

contentvalues成功显示新值。

ListView未使用更新的笔记进行更新,而是继续显示旧笔记。

这是更新的DBHandler:

   public class DBhandler extends SQLiteOpenHelper {
    private SQLiteDatabase db;
    private static final int DATABASE_VERSION = 3;
    private static final String DATABASE_NAME = "notes.db";
    public static final String TABLE_NAME = "notes";
    public static final String KEY_ID = "_id";
    public static final String DATA = "data";
    public static final String DATE = "date";
    public static final String TITLE = "title";
    String CREATE_TABLE = "create table " + TABLE_NAME + "(" + KEY_ID + " integer primary key autoincrement,"
            + DATA + " text not null,"
            + TITLE + " text not null, "
            + DATE + " date "
            + " ) ; ";

    public DBhandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        this.db = db;
        db.execSQL(CREATE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        this.db = db;
        String DROP = "DROP TABLE IF EXISTS " + TABLE_NAME;
        db.execSQL(DROP);
        onCreate(db);
    }

    public void addNote(Note note) {
        db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        String date = cal();
        values.put(DATA, note.getData());
        values.put(TITLE, note.getTitle());
        values.put(DATE, String.valueOf(date));
        db.insert(TABLE_NAME, null, values);


    }


    public void delete() {
        db = getWritableDatabase();
        db.execSQL("DELETE FROM " + TABLE_NAME);
    }

    public void update(int id, String note, String title) {

        String date = cal();
        db = this.getWritableDatabase();
     //   db.rawQuery("UPDATE notes set _id=id,data=note,title=title,date=date where _id=id",null);

        ContentValues values = new ContentValues();
        values.put(KEY_ID, id);
        values.put(DATA, note);
        values.put(TITLE, title);
        values.put(DATE, String.valueOf(date));
       // Log.d("ValueNew", values.toString());
        db.update(TABLE_NAME, values, KEY_ID + " = " + id, null);
        Cursor cursor=db.rawQuery("SELECT * FROM notes",null);
        cursor.moveToFirst();
      //  Log.d("DATABASE",cursor.getString(0)+ " "+cursor.getString(1)+ " "+cursor.getString(2));

        //  db.update();
    }

    public void deleteItem(int id) {
        String DEL = "DELETE FROM " + TABLE_NAME + " " + "WHERE  _id = " + id;
        db = getWritableDatabase();
        db.execSQL(DEL);
    }

    public String cal() {
        Calendar ci = Calendar.getInstance();
        String date = " " + ci.get(Calendar.YEAR) + "-" +
                (ci.get(Calendar.MONTH) + 1) + "-" +
                ci.get(Calendar.DAY_OF_MONTH) + " " +
                ci.get(Calendar.HOUR_OF_DAY) + ":" +
                ci.get(Calendar.MINUTE);
        return date;
    }


}

这是调用update();

的EditNote类
 public class EditNote extends AppCompatActivity {
    Button btn;
    Button clear;
    EditText editNote;
    EditText editTextTitle;
    DBhandler dBhandler;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.notecreate);
        editNote = (EditText) findViewById(R.id.note);
        btn = (Button) findViewById(R.id.save);
        clear = (Button) findViewById(R.id.clear);
        editTextTitle = (EditText) findViewById(R.id.title);
        Bundle bundle = getIntent().getExtras();
        String newTitle = bundle.getString("newtitle");
        String newdata = bundle.getString("newdata");
        final int id = bundle.getInt("CursorId");
        dBhandler = new DBhandler(this);
        editTextTitle.setText(newTitle);
        editNote.setText(newdata);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String title = editTextTitle.getText().toString();
                String noteContent = editNote.getText().toString();
                // Log.d("IDNote",String .valueOf(id));
                Note note = new Note(id, noteContent, title);
                note.setId(id);
                note.setTitle(title);
                note.setData(noteContent);

                    dBhandler.update(id,noteContent,title);
                       // new ListNotesActivity().display();
                    Toast.makeText(getApplicationContext(), "Saved", Toast.LENGTH_SHORT).show();

            }
        });
        clear.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new SaveNoteActivity().clear(editNote, editTextTitle);
            }
        });
    }

}

这是ListNotesActivityClass:

 public class ListNotesActivity extends AppCompatActivity {
    ListView mListView;
    Toolbar toolbar;
    SimpleCursorAdapter simpleCursorAdapter;
    DBhandler dBhandler;
    Cursor c;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.noteslist);
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        mListView = (ListView) findViewById(R.id.notesList);
        registerForContextMenu(mListView);
        display();
        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Cursor cursor = (Cursor) mListView.getItemAtPosition(position);
                String data = (cursor.getString(1));
                Intent intent = new Intent(ListNotesActivity.this, ShowNote.class);
                intent.putExtra("Note", data);
                startActivity(intent);


            }
        });

    }


    @Override
    public boolean onContextItemSelected(MenuItem item) {
        AdapterView.AdapterContextMenuInfo adapterContextMenuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
        int pos = adapterContextMenuInfo.position;
        c = ((SimpleCursorAdapter) mListView.getAdapter()).getCursor();
        c.moveToPosition(pos);

        switch (item.getItemId()) {
            case R.id.update:
                String title=c.getString(2);
                String data=c.getString(1);
                Intent intent=new Intent(ListNotesActivity.this,EditNote.class);
                Bundle extras=new Bundle();
                extras.putInt("CursorId",pos);
                extras.putString("newtitle",title);
                extras.putString("newdata",data);
                intent.putExtras(extras);
                startActivity(intent);
                Toast.makeText(this, "Update", Toast.LENGTH_SHORT).show();

                break;
            case R.id.deleteItem:
                dBhandler.getWritableDatabase();
                new DeleteItemClass().doInBackground(c);
                break;
        }
        return super.onContextItemSelected(item);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.contextmenu, menu);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.listmenu, menu);
        return true;
    }

        public void display() {
            mListView = (ListView) findViewById(R.id.notesList);
            dBhandler = new DBhandler(this);
            SQLiteDatabase db = dBhandler.getReadableDatabase();
            Cursor cursor = db.rawQuery("SELECT *  from " + DBhandler.TABLE_NAME, null);
            String[] titles = new String[]{DBhandler.TITLE, DBhandler.DATE};
             simpleCursorAdapter = new SimpleCursorAdapter(this, R.layout.notetitle, cursor, titles, new int[]{R.id.noteTitleText, R.id.date}, 0);
          // simpleCursorAdapter.notifyDataSetChanged();
            mListView.setAdapter(simpleCursorAdapter);
            simpleCursorAdapter.notifyDataSetChanged();


        }
    @Override
    protected void onResume() {
        super.onResume();
        display();
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        switch (id) {
            case R.id.add:
                Intent intent = new Intent(ListNotesActivity.this, SaveNoteActivity.class);
                startActivity(intent);
                break;
            case R.id.delete:
                dBhandler.getWritableDatabase();
                SQLiteDatabase db = dBhandler.getWritableDatabase();
                Cursor cursor = db.rawQuery("Select * from notes", null);
                if (cursor.getCount() > 0)
                    dialog();
                else {
                    Toast.makeText(this, "No items to delete", Toast.LENGTH_SHORT).show();
                }
                break;
            case R.id.settings:
                Intent intent1 = new Intent(ListNotesActivity.this, SettingsActivity.class);
                startActivity(intent1);
                break;
        }

        return super.onOptionsItemSelected(item);
    }


    public void dialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Confirm");
        builder.setMessage("Are You Sure to Delete?");
        builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                new DeleteClass().doInBackground();
            }
        });
        builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        AlertDialog alertDialog = builder.create();
        alertDialog.show();


    }


    private class DeleteClass extends AsyncTask<Void, Void, DBhandler> {
        @Override
        protected DBhandler doInBackground(Void... params) {
            dBhandler.delete();
            display();
            return dBhandler;


        }

    }

    private class DeleteItemClass extends AsyncTask<Cursor, Void, DBhandler> {
        @Override
        protected DBhandler doInBackground(Cursor... params) {
            dBhandler.deleteItem(Integer.parseInt(c.getString(0)));
            display();
            return dBhandler;
        }
    }
}

Note.java:

public class Note {
    String data;
    int id;
    String title;
    Note(){}
    Note(String title){
        this.title=title;
    }
    Note(String  data,String  title)
    {
        this.title=title;
        this.data=data;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    Note( int id,String data,String  title){
        this.data=data;
        this.id=id;
        this.title=title;

    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

2 个答案:

答案 0 :(得分:0)

实际上问题出在您的KEY_ID上,您正在更新数据库中没有的ID

这就是为什么它没有刷新你的列表视图。

只需将id更改为数据库中的内容即可。

答案 1 :(得分:0)

您可以使用ContentObserver

只要在注册的内容提供商处提交任何更改,它就会通知。

就像:

 // Implement the onChange(boolean) method to delegate the change notification to
 // the onChange(boolean, Uri) method to ensure correct operation on older versions
 // of the framework that did not have the onChange(boolean, Uri) method.
 @Override
 public void onChange(boolean selfChange) {
     onChange(selfChange, null);
 }

 // Implement the onChange(boolean, Uri) method to take advantage of the new Uri argument.
 @Override
 public void onChange(boolean selfChange, Uri uri) {
     // Handle change.
 }

其中......

  

selfChange - &gt; boolean:如果这是自我更改通知,则为True。

     

uri - &gt; Uri:已更改内容的Uri,如果未知则为null。

试试吧,

快乐编码。