CRUD操作でメモ帳アプリケーションを作成する。リストビューを更新するSQLiteの更新操作の後
ListView
の項目を更新しようとしています。この項目には、ノートのタイトルが含まれています。
コンテンツの値が新しい値を正常に表示しています。
しかし、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;
}
}
ここで()の更新を呼び出すEditNoteクラスです。
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 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 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;
}
}
あなたは完全なコードを投稿することができます。助けが簡単になります –
はい、私はコードを更新しました。 –
EditNoteクラスのdisplayメソッドを呼び出すと、android.view.Window.Callbackエラーが発生します。それが役立つかもしれません。 –