在Android中删除或更新SQLite数据库中的条目

在Android中删除或更新SQLite数据库中的条目,android,sqlite,Android,Sqlite,我一天大部分时间都在开发这个应用程序,并创建了一个存储客户信息的SQLite数据库。我有更新和删除SQLite数据库中的项目的选项,但我不知道为什么它不工作(或者它应该如何工作)。我可以添加到数据库中,但不能编辑或删除信息。当我单击listview项目时,在显示特定信息时也遇到了这个问题。当我尝试删除以下内容时,应用程序崩溃: Button addBtn1 = (Button)findViewById(R.id.deleteCust); addBtn1.setOnClic

我一天大部分时间都在开发这个应用程序,并创建了一个存储客户信息的SQLite数据库。我有更新和删除SQLite数据库中的项目的选项,但我不知道为什么它不工作(或者它应该如何工作)。我可以添加到数据库中,但不能编辑或删除信息。当我单击listview项目时,在显示特定信息时也遇到了这个问题。当我尝试删除以下内容时,应用程序崩溃:

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

用于更新 使用此方法传递要更新名称的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;
    }

这就是我用来完成一个类似项目的方法

我添加了logcat确保
数据库
变量不为空。作为一个旁注,永远不要将值附加到SQL字符串中。虽然存在性能方面的负面影响,但更重要的是,这是一个安全问题——请阅读SQL注入的详细信息。正确的方法是使用“cust_id=?”并将值作为参数传入。如何确保数据库变量不为null?我在试着调试时确实看到了这个问题,但我没能弄明白。这看起来太相似了!但是谢谢!它在很大程度上成功了。我已经把事情弄清楚了,但是一直在把deleteData的ID看作Int和String。。。我仍然不是100%地了解ID=?意思是,除了使id等于零之外,还有什么作用?还是在等身份证?
   public boolean deleteCustomer(CustId custid) {
       final SQLiteDatabase db = this.getWritableDatabase();
       final String[] args = {custid};
       return db.delete(CustDBOpenHelper.TABLE_NAME, CustDBOpenHelper.CustID + "=?", args) > 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});
}