无法从数据库获取数据

无法从数据库获取数据

问题描述:

我正在创建一个简单的程序,该程序将文本和计数存储在表中.此数据显示在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.