При попытке удалить данные из базы данных и обновлении ListView происходит сбой приложения - PullRequest
2 голосов
/ 29 июня 2019

Я изучаю программирование на Android и пытаюсь удалить данные из базы данных с помощью кнопки в пользовательском ListView, но, к сожалению, мое приложение зависает при нажатии Да В диалоговом окне оповещения.

FenceActivity

public class FenceActivity extends AppCompatActivity {
    List<Fence> fenceList;
    SQLiteDatabase sqLiteDatabase;
    ListView listViewFences;
    FenceAdapter fenceAdapter;
    DataBaseHelper dataBaseHelper;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.savedfences);

        listViewFences = findViewById(R.id.fencesListView);
        fenceList = new ArrayList<>();

        showFencesFromDatabase();
    }

    public void showFencesFromDatabase() {

        dataBaseHelper = new DataBaseHelper(this);
        Cursor cursor = dataBaseHelper.getAllData();

        if (cursor.moveToFirst()) {
            do {
                fenceList.add(new Fence(cursor.getInt(0), cursor.getDouble(1), cursor.getDouble(2), cursor.getInt(3)));
            } while (cursor.moveToNext());
        }
        cursor.close();

        fenceAdapter = new FenceAdapter(FenceActivity.this, R.layout.list_layout_fences, fenceList);

        listViewFences.setAdapter(fenceAdapter);
    }

    public void reloadFencesFromDatabase() {
        dataBaseHelper = new DataBaseHelper(this);
        Cursor cursor = dataBaseHelper.getAllData();

        if (cursor.moveToFirst()) {
            fenceList.clear();
            do {
                fenceList.add(new Fence(cursor.getInt(0), cursor.getDouble(1), cursor.getDouble(2), cursor.getInt(3)));
            } while (cursor.moveToNext());
        }
        cursor.close();
        fenceAdapter = new FenceAdapter(FenceActivity.this, R.layout.list_layout_fences, fenceList);
        listViewFences.setAdapter(fenceAdapter);
    }
}

Метод ShowFencesFromDatabase, который я использую для получения данных из базы данных.

FenceAdapter

public class FenceAdapter extends ArrayAdapter<Fence> {

    Context context;
    int listLayoutRes;
    List<Fence> fenceList;
    DataBaseHelper dataBaseHelper;
    FenceActivity fenceActivity;

    public FenceAdapter(Context context, int listLayoutRes, List<Fence> fenceList) {
        super(context, listLayoutRes, fenceList);
        this.context = context;
        this.listLayoutRes = listLayoutRes;
        this.fenceList = fenceList;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            convertView = mInflater.inflate(R.layout.list_layout_fences, null);
        }


         final Fence fence = fenceList.get(position);

        TextView textViewSno = convertView.findViewById(R.id.textViewSnoLabel);
        TextView textViewLat = convertView.findViewById(R.id.textViewLatitudeValue);
        TextView textViewLon = convertView.findViewById(R.id.textViewLongitudeValue);
        TextView textViewRadi = convertView.findViewById(R.id.textViewRadiusValue);

        textViewSno.setText(Integer.toString(fence.getSno()));
        textViewLat.setText(String.valueOf(fence.getLat()));
        textViewLon.setText(String.valueOf(fence.getLon()));
        textViewRadi.setText(Integer.toString(fence.getRadius()));

        Button buttonDel = convertView.findViewById(R.id.buttonDeleteFence);

        buttonDel.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                AlertDialog.Builder builder = new AlertDialog.Builder(context);
                builder.setTitle("Are you sure");
                builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        dataBaseHelper = new DataBaseHelper(context);
                        fenceActivity = (FenceActivity)context;
                        dataBaseHelper.deleteDataById(fence);
                        fenceActivity.reloadFencesFromDatabase();
                 }
                });
                builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                    }
                });
                AlertDialog dialog = builder.create();
                dialog.show();
            }
        });
        return convertView;
    }

DatabaseHelper Class

public class DataBaseHelper extends SQLiteOpenHelper {
    private static final String TAG = "DataBaseHelper";
    public static final String DB_NAME = "FenceDatabase";
    private static final String TABLE_NAME = "FenceData";
    private static final String col1 = "Sno";
    private static final String col2 = "Latitude";
    private static final String col3 = "Longitude";
    private static final String col4 = "Radius";

    Context context;

    public DataBaseHelper(Context context) {
        super(context, DB_NAME, null, 1);
        this.context = context;
    }


    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        String createTable = "CREATE TABLE " + TABLE_NAME + " (" + col1 + " INTEGER PRIMARY KEY AUTOINCREMENT, " + col2 + " REAL , " + col3 + " REAL , " + col4 + " INTEGER)";
        sqLiteDatabase.execSQL(createTable);
    }

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

    public boolean addData(Double lat, Double lon, int radi) {
        SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(col2, lat);
        contentValues.put(col3, lon);
        contentValues.put(col4, radi);
        sqLiteDatabase.insert(TABLE_NAME, null, contentValues);
        sqLiteDatabase.close();
        return true;
    }

    public Cursor getAllData() {
        String query = "SELECT * FROM " + TABLE_NAME;
        SQLiteDatabase sqLiteDatabase = this.getReadableDatabase();
        Cursor cursor = sqLiteDatabase.rawQuery(query, null);
        return cursor;
    }

    public void deleteDataById(Fence fence) {
        SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
        String sql = "DELETE FROM FenceData WHERE Sno = ?";
        sqLiteDatabase.execSQL(sql, new Integer[]{fence.getSno()});
    }
}

класс ограждений

public class Fence {

    int radius,sno;
    double lat,lon;

    public Fence( int sno,double lat, double lon,int radius) {
        this.radius = radius;
        this.sno = sno;
        this.lat = lat;
        this.lon = lon;
    }

    public int getRadius() {
        return radius;
    }

    public int getSno() {
        return sno;
    }

    public double getLat() {
        return lat;
    }

    public double getLon() {
        return lon;
    }
}

Ошибка

2019-06-30 19:06:08.658 22783-22875/com.abhishakkrmalviya.fencetest E/LB: fail to open file: No such file or directory
2019-06-30 19:06:11.473 22783-22783/com.abhishakkrmalviya.fencetest E/SchedPolicy: set_timerslack_ns write failed: Operation not permitted

Какие шаги нужно предпринять, чтобы приложение работало правильно, я имею в виду удаление данных из базы данных?

Ответы [ 2 ]

1 голос
/ 29 июня 2019

Инициализировать dataBaseHelper = new DataBaseHelper(context); перед вызовом dataBaseHelper.deleteDataById();

0 голосов
/ 29 июня 2019

Проблема в FenceAdapter.

builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    dataBaseHelper.deleteDataById();
                    fenceActivity.showFencesFromDatabase();
                }
            });

Проблема в том, что dataBaseHelper не инициализируется перед его использованием.

Это можно решить, добавив строку dataBaseHelper = new DataBaseHelper(context); в конце конструктора адаптера.

...