2016-09-11 2 views
-1

Я работаю над этим приложением большую часть дня и создаю базу данных 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 
+0

Я добавил logcat –

+1

Убедитесь, что переменная 'database' isnt null. – Enzokie

+0

В качестве побочного примечания - никогда не добавляйте значения в строку SQL. Это негативные последствия для производительности, но даже более важная проблема с безопасностью - подробнее прочтите SQL-инъекцию. Правильный способ сделать это - использовать «cust_id =?» и передать значение в качестве параметра. –

ответ

0
public boolean UpdateData(String ID, String First, String Last, String MAKE, String MODEL, String Cost) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues cv = new ContentValues(); 

    cv.put(CUSTOMER_FIRST_NAME, First); 
    cv.put(CUSTOMER_LAST_NAME, Last); 
    cv.put(CAR_MAKE, MAKE); 
    cv.put(CAR_MODEL, MODEL); 
    cv.put(COST, Cost); 
    db.update(Table_name, cv, "ID = ?", new String[]{ID}); 
    return true; 
} 

public Integer deleteData(String ID) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    return db.delete(Table_name, "ID =?", new String[]{ID}); 
} 

Это то, что я использовал к завершить аналогичный проект

+0

Это тоже похоже! Но спасибо! это пошло по большей части. Я понял все, но застрял, глядя на идентификатор для deleteData как Int против String ... Я все еще не 100% относительно того, что ID =? означает, что делает, кроме того, делает id равным ничто? или он ждет идентификатора? –

0

Для обновления использовать этот метод, чтобы передать CUSTOMERID которого Имя вы хотите обновить

public void updateFirstName(CustId custid, String firstname) { 
     final SQLiteDatabase db = this.getWritableDatabase(); 
     final String[] args = {custid}; 
     ContentValues values = new ContentValues(); 
     values.put(CustDBOpenHelper.FirstName, firstname); 
     db.update(CustDBOpenHelper.TABLE_NAME, values, CustDBOpenHelper.CustID + "=?", args); 
    } 

Для УДАЛИТЬ

public boolean deleteCustomer(CustId custid) { 
     final SQLiteDatabase db = this.getWritableDatabase(); 
     final String[] args = {custid}; 
     return db.delete(CustDBOpenHelper.TABLE_NAME, CustDBOpenHelper.CustID + "=?", args) > 0; 
    } 
Смежные вопросы