텍스트와 수를 테이블에 저장하는 간단한 프로그램을 만들고 있습니다. 이 데이터는 listView에 표시됩니다. 업데이트 된 데이터를받을 때 문제가 발생했습니다. 그러나 응용 프로그램을 닫고 열 때 데이터가 잘로드됩니다. 내 프로그램을 포함 시켰습니다.데이터베이스에서 데이터를 가져올 수 없습니다.
MainActivity :
public class MainActivity extends AppCompatActivity {
private List<Habit> habits;
private ListAdapter adapter;
private DatabaseHandler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
handler = new DatabaseHandler(getApplicationContext());
habits = handler.getAllHabit();
View empty = getLayoutInflater().inflate(R.layout.list_item_empty, null, false);
addContentView(empty, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
ListView habitList = (ListView) findViewById(R.id.habitList);
adapter = new ListAdapter(habits);
if (habitList != null) {
habitList.setAdapter(adapter);
habitList.setEmptyView(empty);
habitList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Habit habit = (Habit) adapter.getItem(position);
habit.updateCount();
handler.updateHabit(habit);
updateList();
}
});
habitList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
Habit habit = (Habit) adapter.getItem(position);
handler.deleteHabit(habit);
updateList();
return true;
}
});
}
}
private void getNewHabit() {
final AlertDialog.Builder alertDialog = new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.Dialog));
alertDialog.setTitle("New Habit");
alertDialog.setMessage("Enter the name of the new habit");
final EditText input = new EditText(getApplicationContext());
int padding = Math.round(getResources().getDimension(R.dimen.margin));
input.setPadding(padding,padding,padding,padding);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
input.setLayoutParams(params);
alertDialog.setView(input);
alertDialog.setPositiveButton("Add", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Habit habit = new Habit();
habit.setHabit(input.getText().toString());
habit.setCount(0);
handler.addHabit(habit);
updateList();
}
});
alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
alertDialog.show();
}
private void updateList() {
habits.clear();
habits = handler.getAllHabit();
adapter.notifyDataSetChanged();
}
}
DatabaseHandler :
class DatabaseHandler extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "habitDatabase";
private static final String TABLE_NAME = "userHabits";
private static final String KEY_ID = "id";
private static final String KEY_HABIT_NAME = "name";
private static final String KEY_HABIT_COUNT = "count";
public DatabaseHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "(" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_HABIT_NAME + " TEXT," + KEY_HABIT_COUNT + " INTEGER)";
db.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
public void addHabit(Habit habit) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_HABIT_NAME, habit.getHabit());
values.put(KEY_HABIT_COUNT, habit.getCount());
db.insert(TABLE_NAME, null, values);
db.close();
}
public int updateHabit(Habit habit) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_HABIT_NAME, habit.getHabit());
values.put(KEY_HABIT_COUNT, habit.getCount());
return db.update(TABLE_NAME, values, KEY_ID + " = ?", new String[]{String.valueOf(habit.getId())});
}
public void deleteHabit(Habit habit) {
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_NAME, KEY_ID + " = ?", new String[]{String.valueOf(habit.getId())});
db.close();
}
public List<Habit> getAllHabit() {
List<Habit> habits = new ArrayList<>();
String SELECT_QUERY = "SELECT * FROM " + TABLE_NAME;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(SELECT_QUERY, null);
if (cursor.moveToFirst()) {
do {
Habit habit = new Habit();
habit.setHabit(cursor.getString(1));
habit.setCount(Integer.parseInt(cursor.getString(2)));
habit.setId(Integer.parseInt(cursor.getString(0)));
habits.add(habit);
} while (cursor.moveToNext());
}
cursor.close();
return habits;
}
}
[mcve] –
에 질문이 포함되어 있는지 확인하십시오. –
AlertDialog를 사용하여 새 항목을 추가 한 후에도 listView에 표시되지 않습니다. 하지만 앱을 닫고 다시 열면 새 항목이 표시됩니다. 내 문제는 MainActivity의 updateList()에 있다고 생각합니다. 그러나 나는 무엇이 잘못 될지 확신하지 못한다. –