Я работаю над этим приложением большую часть дня и создаю базу данных SQLite, в которой хранятся данные о клиентах. У меня есть опции для обновления и удаления элементов из базы данных SQLite, и я не могу понять, почему он не работает (или как он должен работать). Я могу добавить в базу данных, но не могу редактировать или удалять информацию. Я также сталкиваюсь с проблемой при отображении определенной информации, когда я нажимаю элемент списка. В приложение crashses при попытке удаления:Удаление или обновление записи в базе данных SQLite в Android
Button addBtn1 = (Button)findViewById(R.id.deleteCust);
addBtn1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Cursor cursor = datasource.displayCurrentCustomer();
if(cursor != null) {
String where = CustDBOpenHelper.CustID + "=" + dbOpenHelper.CustID;
database.delete(CustDBOpenHelper.TABLE_NAME, where, null);
startActivity(new Intent(EditCustomers.this, CustomerView.class));
}
}
});
это помощник:
public class CustDBOpenHelper extends SQLiteOpenHelper {
private static final String LOGTAG = "test";
private static final String DATABASE_NAME = "CARDEALER.db";
private static final int DATABASE_VERSION = 1;
public static final String TABLE_NAME = "CUSTOMER_TABLE";
public static final String CustID = "cust_id";
public static final String FirstName = "first_name";
public static final String LastName = "last_name";
public static final String CarMake = "car_make";
public static final String CarModel = "car_model";
public static final String CarCost = "car_cost";
private static final String TABLE_CREATE =
" CREATE TABLE " + TABLE_NAME + " (" +
CustID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
FirstName + " TEXT, "+
LastName + " TEXT, " +
CarMake + " TEXT, " +
CarModel + " TEXT, " +
CarCost + " NUMERIC " + ")";
public CustDBOpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db){
db.execSQL(TABLE_CREATE);
Log.i(LOGTAG, "Table created");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int NewVersion){
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
}
Я был на этом пути слишком долго и может быть легко видом что-то, но я я в настоящее время в точке прерывания. Я предполагаю, что когда я выясню, как удалить или обновить текущую базу данных SQLite, вам станет легче, но я все пробовал, по крайней мере, кажется, что у меня есть. Я предполагаю, что часть проблемы - это то, что я показываю, когда я нажимаю элемент списка, так как он всегда отображает первый элемент моей базы данных SQLite. Этот код:
List<Custs> custs = datasource.findAll();
if (custs.size() == 0) {
Toast.makeText(this,"No customer information to show", Toast.LENGTH_SHORT).show();
}
ArrayAdapter<Custs> adapter = new ArrayAdapter<Custs>(this, android.R.layout.simple_list_item_1 , custs);
ListView lv = (ListView) findViewById(R.id.custListView);
lv.setAdapter(adapter);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
startActivity(new Intent(CustomerView.this , EditCustomers.class));
}
});
и Logcat, который показывает, что он падает прямо на 73, который при попытке удалить элемент.
09-10 20:54:25.497 6153-6153/mbl402.phoenix.edu.week4appni4992 E/AndroidRuntime: FATAL EXCEPTION: main
Process: mbl402.phoenix.edu.week4appni4992, PID: 6153
java.lang.NullPointerException: Attempt to invoke virtual method 'int android.database.sqlite.SQLiteDatabase.delete(java.lang.String, java.lang.String, java.lang.String[])' on a null object reference
at mbl402.phoenix.edu.week4appni4992.EditCustomers$2.onClick(EditCustomers.java:73)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
--------- beginning of system
Я добавил logcat –
Убедитесь, что переменная 'database' isnt null. – Enzokie
В качестве побочного примечания - никогда не добавляйте значения в строку SQL. Это негативные последствия для производительности, но даже более важная проблема с безопасностью - подробнее прочтите SQL-инъекцию. Правильный способ сделать это - использовать «cust_id =?» и передать значение в качестве параметра. –