簡體   English   中英

Android 中的 SQLite - 如何刷新列表

[英]SQLite in Android - How to refresh the list

我正在制作酒單應用程序。 我也在嘗試在其中使用 SQLite,我很難掌握它。

我有很多活動,但現在有兩個與此相關。

  • MainActivity - 這只是在 ListView 中顯示葡萄酒的名稱
  • AddActivity - 這有酒名、價格和描述的 EditTexts。

我目前遇到的問題是,當我將葡萄酒添加到列表中時,當我回到 MainActivity 時,列表不會顯示新添加的 Wine,直到我關閉應用程序並返回它。

我該如何解決?


這是我的主要方法:

public class MainActivity extends AppCompatActivity {

    DatabaseHelper mDatabaseHelper;
    ListView listView;
    ArrayAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);


        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intentGoToAdd = new Intent(MainActivity.this, AddActivity.class);
                startActivity(intentGoToAdd);
            }
        });

        mDatabaseHelper = new DatabaseHelper(this);

        arrayListAndAdapter();

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long l) {
                SQLiteDatabase db = mDatabaseHelper.getReadableDatabase();

                //Which columns I want to select
                String[] projection = {
                        WineContract.WineEntry.COLUMN_ID,
                        WineContract.WineEntry.COLUMN_WINE_NAME,
                        WineContract.WineEntry.COLUMN_WINE_PRICE,
                        WineContract.WineEntry.COLUMN_WINE_DESCRIPTION};

                Cursor cursor = db.query(WineContract.WineEntry.TABLE_NAME, projection,null,null,null,null,null);
                cursor.moveToPosition(position);
                Intent intentGoToDetails = new Intent(MainActivity.this,DetailsActivity.class);
                String name = cursor.getString(cursor.getColumnIndex(WineContract.WineEntry.COLUMN_WINE_NAME));
                String price = cursor.getString(cursor.getColumnIndex(WineContract.WineEntry.COLUMN_WINE_PRICE));
                String description = cursor.getString(cursor.getColumnIndex(WineContract.WineEntry.COLUMN_WINE_DESCRIPTION));
                intentGoToDetails.putExtra("NAME", name);
                intentGoToDetails.putExtra("PRICE", price);
                intentGoToDetails.putExtra("DESCRIPTION", description);
                startActivity(intentGoToDetails);
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_deleteDB) {
            mDatabaseHelper.deleteDatabase();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public void arrayListAndAdapter(){
        SQLiteDatabase db = mDatabaseHelper.getReadableDatabase();

        //Which columns I want to select
        String[] projection = {
                WineContract.WineEntry.COLUMN_ID,
                WineContract.WineEntry.COLUMN_WINE_NAME,
                WineContract.WineEntry.COLUMN_WINE_PRICE,
                WineContract.WineEntry.COLUMN_WINE_DESCRIPTION};

        Cursor cursor = db.query(WineContract.WineEntry.TABLE_NAME, projection,null,null,null,null,null);

        ArrayList<String> mArrayList = new ArrayList<String>();
        while(cursor.moveToNext()) {
            mArrayList.add(cursor.getString(cursor.getColumnIndex(WineContract.WineEntry.COLUMN_WINE_NAME))); //add the item
        }
        listView = (ListView) findViewById(R.id.list);
        adapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, mArrayList);
        listView.setAdapter(adapter);
    }
}

這是添加活動:

public class AddActivity extends AppCompatActivity {

    EditText editWineName, editWinePrice, editWineDescription;
    DatabaseHelper mDatabaseHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add);

        mDatabaseHelper = new DatabaseHelper(this);

        editWineName = (EditText) findViewById(R.id.editWineName);
        editWinePrice = (EditText) findViewById(R.id.editWinePrice);
        editWineDescription = (EditText) findViewById(R.id.editWineDescription);
    }

    public void toastMessage(String message){
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_add, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_deleteDB) {
            long result = mDatabaseHelper.addWine(editWineName.getText().toString(), editWinePrice.getText().toString(), editWineDescription.getText().toString() );
            if (result!=-1){
                toastMessage(editWineName.getText().toString() + " was added to the list.");
                finish();
            }else{
                toastMessage("Error");
            }
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

如有必要,這是我的 DatabaseHelper 類:

public class DatabaseHelper extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "wines.db";
    private static final String SQL_CREATE =
            "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (" +
            COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            COLUMN_WINE_NAME + " TEXT, " +
                    COLUMN_WINE_PRICE + " TEXT, " +
            COLUMN_WINE_DESCRIPTION + " TEXT);";



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

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(SQL_CREATE);
    }

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

    public long addWine(String name, String price, String description){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(COLUMN_WINE_NAME, name);
        values.put(COLUMN_WINE_PRICE, price);
        values.put(COLUMN_WINE_DESCRIPTION, description);
        return db.insert(TABLE_NAME,null, values);
    }

    public void deleteDatabase(){
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_NAME,null,null);
    }
}

您的活動僅創建一次,因此 onCreate 僅在第一次被調用。 您想要的是每次 MainActivity 恢復時數據都是新鮮的。 如果您覆蓋 onResume 方法並放置您的 arrayListAndAdapter() 方法和 setOnItemClickListener,您將獲得所需的效果。 所以這是新代碼(您也可以從 onCreate 中刪除此代碼以防止查詢兩次):

@Override
protected void onResume() {
    super.onResume();
    arrayListAndAdapter();

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long l) {
        SQLiteDatabase db = mDatabaseHelper.getReadableDatabase();

        //Which columns I want to select
        String[] projection = {
                WineContract.WineEntry.COLUMN_ID,
                WineContract.WineEntry.COLUMN_WINE_NAME,
                WineContract.WineEntry.COLUMN_WINE_PRICE,
                WineContract.WineEntry.COLUMN_WINE_DESCRIPTION};

        Cursor cursor = db.query(WineContract.WineEntry.TABLE_NAME, projection,null,null,null,null,null);
        cursor.moveToPosition(position);
        Intent intentGoToDetails = new Intent(MainActivity.this,DetailsActivity.class);
        String name = cursor.getString(cursor.getColumnIndex(WineContract.WineEntry.COLUMN_WINE_NAME));
        String price = cursor.getString(cursor.getColumnIndex(WineContract.WineEntry.COLUMN_WINE_PRICE));
        String description = cursor.getString(cursor.getColumnIndex(WineContract.WineEntry.COLUMN_WINE_DESCRIPTION));
        intentGoToDetails.putExtra("NAME", name);
        intentGoToDetails.putExtra("PRICE", price);
        intentGoToDetails.putExtra("DESCRIPTION", description);
        startActivity(intentGoToDetails);

    }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM