Удалить строку В customAdapter расширяет BaseAdapter с помощью SQLite - Android - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь получить строку в моей базе данных SQLite для удаления при нажатии кнопки. Мне удалось получить строку для удаления в ListView, но каждый раз, когда я пытаюсь удалить приложение из sqlite, происходит сбой.

dba.removeData(position);

mModel.remove(position);
notifyDataSetChanged();

Это просто удалить элемент в ListView, а не строку в базе данных.

public class CustomAdapter extends BaseAdapter {
private int custom_adapter;
private Context context;
private ArrayList<Model> mModel;
DatabaseHelper dba = new DatabaseHelper(this.context);

public CustomAdapter(Context context, int custom_adapter, ArrayList<Model> mModel) {
    this.context = context;
    this.mModel = mModel;
    this.custom_adapter = custom_adapter;

}




@Override
public int getCount() {

    return mModel.size();
}

@Override
public Object getItem(int position) {

    return mModel.get(position);
}

@Override
public long getItemId(int position) {

    return mModel.get(position).getId();
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    View v = View.inflate(context, R.layout.custom_adapter, null);
    final TextView ID = (TextView) v.findViewById(R.id.textViewID);
    TextView przejechane = (TextView) v.findViewById(R.id.textViewPrzejechane);
    TextView spalone = (TextView) v.findViewById(R.id.textViewSpalanie);
    TextView zuzytePaliwo = (TextView) v.findViewById(R.id.textViewUzytepaliwo);
    final TextView dataView = (TextView) v.findViewById(R.id.textViewData);
    final Button btnDelete = (Button) v.findViewById(R.id.btnDelete);
    final ListView listView = (ListView) v.findViewById(R.id.listview);
    ID.setText(String.valueOf( mModel.get(position).getId()));
    przejechane.setText(String.valueOf( mModel.get(position).getAmount_km()));
    spalone.setText(String.valueOf( mModel.get(position).getAvg()));
    zuzytePaliwo.setText(String.valueOf( mModel.get(position).getAmount_fuel()));
    dataView.setText(String.valueOf( mModel.get(position).getData()));



    btnDelete.setTag(position);


    btnDelete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            dba.removeData(position);

            mModel.remove(position);
            notifyDataSetChanged();

            }
    });

    return v;
}

вот мой DatabaseHelper

public class DatabaseHelper extends SQLiteOpenHelper {

private SQLiteDatabase mDatabase;
public static final String DATABASE_NAME = "AvgFuel.db";
public static final String TABLE_NAME = "avgFuel_table";

public static final String ID = "ID";
public static final String AMOUNT_FUEL = "AMOUNT_FUEL";
public static final String AMOUNT_KM = "AMOUNT_KM";
public static final String AVG = "AVG";
public static final String DATA = "DATA";
private static final String SELECT_PEOPLE = "SELECT * FROM " + TABLE_NAME;

public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, 1);

}



@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("create table " + TABLE_NAME + "(" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            AMOUNT_FUEL + " REAL, " + AMOUNT_KM + " REAL, " + AVG + " REAL, " + DATA + " TEXT" + ");");

}

@Override
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    onCreate(db);
}

public boolean insertData(String amount_fuel, String amount_km, double avg){
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(AMOUNT_FUEL,amount_fuel);
    contentValues.put(AMOUNT_KM,amount_km);
    contentValues.put(AVG,avg);
    contentValues.put(DATA,getNow());
    long result = db.insert(TABLE_NAME, null, contentValues);
    if (result == -1)
        return false;
    else
        return true;
}
public void removeData(int id){
    SQLiteDatabase db = this.getReadableDatabase();
    db.delete(TABLE_NAME, ID + "=" + id , null);
    db.close();
}

public ArrayList<Model> getModels() {
    ArrayList<Model> model = new ArrayList<Model>();
    mDatabase = this.getReadableDatabase();
    Cursor cursor = mDatabase.rawQuery(SELECT_PEOPLE, null);
    cursor.moveToNext();
    for (int i = 0; i <cursor.getCount() ; i++) {
        model.add(new Model(cursor.getInt(0),cursor.getString(1),cursor.getString(2),cursor.getString(3),cursor.getString(4)));
        cursor.moveToNext();
    }
    cursor.close();
    mDatabase.close();
    return model;
}
public Model getModel(int id){
    mDatabase = this.getReadableDatabase();
    String s = "SELECT * FROM" + TABLE_NAME + "WHERE " + ID + "=" + id;
    Cursor cursor = mDatabase.rawQuery(s,null);
    cursor.moveToFirst();
    Model model = new Model(cursor.getInt(0),cursor.getString(1),cursor.getString(2),cursor.getString(3),cursor.getString(4));
    cursor.close () ;
    mDatabase.close () ;
    return model ;
}
private String getNow(){
    // set the format to sql date time
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date = new Date();
    return dateFormat.format(date);
}

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Я думаю, что проблема в dba создании. Здесь вы просто используете этот контекст адаптера. Это должен быть контекст, который вы получаете от Activity.

DatabaseHelper dba = new DatabaseHelper(this.context);

Попробуйте использовать это

public CustomAdapter(Context context, int custom_adapter, ArrayList<Model> mModel) {
    this.context = context;
    this.mModel = mModel;
    this.custom_adapter = custom_adapter;
    dba = new DatabaseHelper(context);
}

Чтобы узнать реальную позицию реселлера, вы можете использовать getAdapterPosition(). Как это

dba.removeData(mModel.get(getAdapterPosition()).getId());

Надеюсь, это поможет.

0 голосов
/ 08 мая 2018

Попробуйте изменить это ..mModel.get (position) .getId ()

 dba.removeData(mModel.get(position).getId());
...