单击保存按钮或搜索时,Android应用程序崩溃

时间:2018-08-04 16:52:04

标签: java android android-sqlite

我是Android新手。我正在运行SQLite筛选器ListView。我在对话框中添加了EditTextpriceEditTxt,并在数据库中添加了另一列“价格”。当我搜索或单击“保存”按钮时,该应用程序将停止。我不知道该怎么解决。

Display()函数具有两个EditText和一个保存按钮。当我单击“保存”按钮时,该应用程序停止运行。

当我单击searchview时,getPlanet()函数用于显示搜索列表。我对此不太了解。

MainActivity.java:

private void displayDialog()
{
    Dialog d=new Dialog(this);
    d.setTitle("SQLite Database");
    d.setContentView(R.layout.dialog_layout);

    nameEditText= (EditText) d.findViewById(R.id.nameEditTxt);

        **////////////////////Price edit text which I add/////////////**
    priceEditText= (EditText) d.findViewById(R.id.priceEditTxt);
    saveBtn= (Button) d.findViewById(R.id.saveBtn);
    retrieveBtn= (Button) d.findViewById(R.id.retrieveBtn);

    saveBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            save(nameEditText.getText().toString(),priceEditText.getText().toString());
        }
    });
    retrieveBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
             getPlanets(null);
        }
    });

    d.show();
}
** //save button took one argument "name" only, i add "price" later//**
private void save(String name,String price)
{
    DBAdapter db=new DBAdapter(this);
    db.openDB();
    if(db.add(name,price))
    {
        nameEditText.setText("");
        priceEditText.setText("");
    }else {
        Toast.makeText(this,"Unable To Save",Toast.LENGTH_SHORT).show();
    }

    db.closeDB();

    this.getPlanets(null);
}

private void getPlanets(String searchTerm)
{
    planets.clear();

    DBAdapter db=new DBAdapter(this);
    db.openDB();
    Planet p=null;
    Cursor c=db.retrieve(searchTerm);
    while (c.moveToNext())
    {
        int id=c.getInt(0);
        String name=c.getString(1);

        p=new Planet();
        p.setId(id);
        p.setName(name);

        planets.add(p);
    }

    db.closeDB();

    lv.setAdapter(adapter);

}

DBAdapter.java包含addretrieve函数,我从MainActivity调用它们。

DBAdapter.java:

public class DBAdapter {

    Context c;
    SQLiteDatabase db;
    DBHelper helper;

    public DBAdapter(Context c) {
        this.c = c;
        helper=new DBHelper(c);
    }

    //OPEN DB
    public void openDB()
    {
        try
        {
           db=helper.getWritableDatabase();
        }catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    //CLOSE
    public void closeDB()
    {
        try
        {
            helper.close();
        }catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    //INSERT DATA
    public boolean add(String name,String price)
    {
        try
        {
            ContentValues cv=new ContentValues();
            cv.put(Constants.NAME, name);
            cv.put(Constants.PRICE, price);
            //Log.d(Constants.PRICE,"here we gooooooooooooooooooooooooooooooooooooooooooooooooooo");

            db.insert(Constants.TB_NAME, Constants.ROW_ID, cv);

            return true;

        }catch (SQLException e)
        {
            e.printStackTrace();
        }
        return false;
    }

    //RETRIEVE DATA AND FILTER
    public Cursor retrieve(String searchTerm)
    {
        String[] columns={Constants.ROW_ID,Constants.NAME};
        Cursor c=null;

        if(searchTerm != null && searchTerm.length()>0)
        {
            String sql="SELECT * FROM "+Constants.TB_NAME+" WHERE "+Constants.NAME+" LIKE '%"+searchTerm+"%'";
            c=db.rawQuery(sql,null);
            return c;

        }

        c=db.query(Constants.TB_NAME,columns,null,null,null,null,null);
        return c;
    }
}

Constants.java包含可创建和可删除的查询。我不知道create table查询是否正确。

Constants.java:

public class Constants {
    //COLUMNS
    static final String ROW_ID="id";
    static final String NAME="name";
    static final String PRICE="price";

    //DB
    static final String DB_NAME="ii_DB";
    static final String TB_NAME="ii_TB";
    static final int DB_VERSION=2;

    //CREATE TB
    static final String CREATE_TB="CREATE TABLE ii_TB(id INTEGER PRIMARY KEY AUTOINCREMENT,"
            + "name TEXT NOT NULL,price TEXT NOT NULL);";

    //DROP TB
    static final String DROP_TB="DROP TABLE IF EXISTS "+TB_NAME;
}

1 个答案:

答案 0 :(得分:0)

您将为每个操作创建DBAdapter的不同实例,并在这些操作上打开与数据库的新连接。另外,每次完成该操作时,您都将关闭这些连接。

尝试建立与数据库的新连接非常昂贵,如此处所述:Persisting database connection。对数据库执行新操作时,数据库可能未打开或未准备就绪。

了解了这些简单的信息后,我们可能会假设dbAdapter.openDB()可能在数据库尚未就绪时引发异常。因此,使变量db仍然等于null。我假设您的错误是 NullPointerException ,因此,您无法对数据库进行操作。


TL; DR
创建一个DBAdapter实例。一次调用openDB。然后在destroy上调用closeDB。


更多或其他来源
Kevin Galligan's Answer for Best Practices