Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android中的SQLite-如何刷新列表_Java_Android_Sqlite - Fatal编程技术网

Java Android中的SQLite-如何刷新列表

Java Android中的SQLite-如何刷新列表,java,android,sqlite,Java,Android,Sqlite,我正在制作一个酒单应用程序。我还尝试在其中使用SQLite,这让我很难掌握窍门 我有很多活动,但目前有两项与此相关 MainActivity-这只是在列表视图中显示葡萄酒的名称 AddActivity-它包含葡萄酒名称、价格和描述的编辑文本 我目前遇到的问题是,当我向列表中添加葡萄酒时,当我返回到主活动时,列表中不会显示新添加的葡萄酒,直到我关闭应用程序并返回 我该如何解决这个问题 以下是我的主要方法: public class MainActivity extends AppCompat

我正在制作一个酒单应用程序。我还尝试在其中使用SQLite,这让我很难掌握窍门

我有很多活动,但目前有两项与此相关

  • MainActivity-这只是在列表视图中显示葡萄酒的名称
  • AddActivity-它包含葡萄酒名称、价格和描述的编辑文本
我目前遇到的问题是,当我向列表中添加葡萄酒时,当我返回到主活动时,列表中不会显示新添加的葡萄酒,直到我关闭应用程序并返回

我该如何解决这个问题


以下是我的主要方法:

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);
    }
}
如果需要,下面是我的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中删除此代码,以防止查询两次):

@覆盖
受保护的void onResume(){
super.onResume();
arrayListAndAdapter();
setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父视图、视图视图、整型位置、长l){
SQLiteDatabase db=mDatabaseHelper.getReadableDatabase();
//我要选择哪些列
字符串[]投影={
WineContract.WineEntry.COLUMN\u ID,
WineContract.WineEntry.COLUMN\u WINE\u NAME,
WineContract.WineEntry.COLUMN\u WINE\u价格,
WineContract.WineEntry.COLUMN\u WINE\u DESCRIPTION};
Cursor Cursor=db.query(WineContract.WineEntry.TABLE_NAME,projection,null,null,null,null);
光标。移动位置(位置);
Intent intentGoToDetails=新意图(MainActivity.this,DetailsActivity.class);
字符串名称=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);
intentGoToDetails.putExtra(“价格”,PRICE);
intentGoToDetails.putExtra(“说明”,说明);
startActivity(意向性细节);
}
});

下面是这几行现在的样子:它修复了它,但它只在我从AddActivity返回时修复了它。例如,在菜单栏的MainActivity上,我有一个“删除数据库”选项。如果我选择它也不会立即刷新数据。我只是不太明白如何应用它,以便它在其他领域也能工作。哦,等等,我刚刚得到它。第一次我把onResume方法放在.deleteDatabase方法之前。我只是把它放在后面,这次它按预期工作。所以我得到的是ArrayList只是创建一次,也就是第一次创建MainActivity时。将arraylist方法放在onResume方法中基本上会使应用程序在每次启动MainActivity时都重新创建arraylist。对吗?我不完全确定你在问什么。如果你以任何方式更改数据形状或形式,你需要调用arraylist但是,还有其他方法可以处理适配器中的数据更改而无需重新查询,例如BaseAdapter中的notifyDataSetChanged()方法
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);
    }
}
@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);

    }
});