Приложение Android вылетает, когда я нажимаю кнопку сохранения или выполняю поиск

Я новичок в Android. Я использую SQLite Filter ListView. Я добавил EditText, priceEditTxt в диалоговое окно и еще один столбец «Цена» в базе данных. Когда я ищу или нажимаю кнопку «Сохранить», приложение останавливается. Я не знаю, как это решить.

Функция Display() имеет два EditText и одну кнопку сохранения. При нажатии на кнопку сохранения приложение, к сожалению, перестает работать.

Функция 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 содержит функции add и retrieve, которые я вызываю из 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 содержит запросы, которые можно создать и удалить. Я не знаю, верен ли запрос на создание таблицы или нет.

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;
}

опубликуйте ошибку logcat. Где вылетает?

sanjeev 04.08.2018 18:54

Когда ваша кнопка сохранения нажата, он вызывает ваш метод save, который может вызывать исключение при попытке использовать базу данных.

0xCursor 04.08.2018 19:34

да. ошибка в методе сохранения

Tab123 05.08.2018 06:16
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
65
1

Ответы 1

Вы создаете разные экземпляры DBAdapter для каждой операции и открываете новое соединение с базой данных для этих операций. Кроме того, вы закрываете эти соединения каждый раз, когда завершаете операцию.

Попытка получить новое соединение с вашей базой данных стоит дорого, как указано здесь: Постоянное соединение с базой данных. База данных, вероятно, не открыта или не готова, когда вы выполняете новую операцию с вашей базой данных.

Зная эти простые вещи, мы, вероятно, предположим, что dbAdapter.openDB () может вызвать исключение, когда база данных еще не готова. Таким образом, оставив переменную db равной нулю. Я предполагаю, что ваша ошибка - Исключение нулевого указателя, и из-за этого вы не можете выполнять операции с вашей базой данных.


TL; DR
Создайте единственный экземпляр DBAdapter. Вызовите openDB один раз. И вызовите closeDB при уничтожении.


Больше или другие источники
Ответ Кевина Галлигана на лучшие практики

Я пробовал тот же код на другом устройстве, он работает нормально !!

Tab123 05.08.2018 06:42

Вы считали, что у этих устройств разные аппаратные возможности, или вы упорны?

Jian Astrero 05.08.2018 07:41

Другие вопросы по теме