无法从数据库获取数据
我正在创建一个简单的程序,该程序将文本和计数存储在表中.此数据显示在listView中.我在更新数据时遇到问题.但是,当我关闭并打开应用程序时,数据加载良好.我已经包含了我的程序.
I am creating a simple program which stores a text and a count in a table. This data is displayed in a listView. I am having trouble getting the data as and when it gets updated. But, the data loads fine when I close and open the app. I have included my program.
MainActivity:
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:
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;
}
}
我知道了.我不知道这是正确的方法还是只是一种解决方法.在updateList()
方法中,我更改了行
I got it working. I don't know if this is the right method or if it is just a workaround. In the updateList()
method, I changed the line
habits = handler.getAllHabit();
到
habits.addAll(handler.getAllHabit());
在我使用AlertDialog添加项目之后,listView立即更新.
The listView updates immediately now right after I add an item using the AlertDialog.