Я новичок в 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;
}
Когда ваша кнопка сохранения нажата, он вызывает ваш метод save, который может вызывать исключение при попытке использовать базу данных.
да. ошибка в методе сохранения




Вы создаете разные экземпляры DBAdapter для каждой операции и открываете новое соединение с базой данных для этих операций. Кроме того, вы закрываете эти соединения каждый раз, когда завершаете операцию.
Попытка получить новое соединение с вашей базой данных стоит дорого, как указано здесь: Постоянное соединение с базой данных. База данных, вероятно, не открыта или не готова, когда вы выполняете новую операцию с вашей базой данных.
Зная эти простые вещи, мы, вероятно, предположим, что dbAdapter.openDB () может вызвать исключение, когда база данных еще не готова. Таким образом, оставив переменную db равной нулю. Я предполагаю, что ваша ошибка - Исключение нулевого указателя, и из-за этого вы не можете выполнять операции с вашей базой данных.
TL; DR
Создайте единственный экземпляр DBAdapter. Вызовите openDB один раз. И вызовите closeDB при уничтожении.
Больше или другие источники
Ответ Кевина Галлигана на лучшие практики
Я пробовал тот же код на другом устройстве, он работает нормально !!
Вы считали, что у этих устройств разные аппаратные возможности, или вы упорны?
опубликуйте ошибку logcat. Где вылетает?