简体   繁体   中英

Delete record from sqlite database through Recyclerview in android

I have made an app that lets the user add location through place picker and add them into the SQLite database.I am displaying these locations in recyclerview. In order to delete an item from recyclerview, this is what I have done so far.

1) User long presses on an item in recyclerview and then alert dialogue appears with 2 buttons (Delete and Cancel).

What I can't-do:

1) Now I don't know how to delete an item from recyclerview and from SQLite database when the user taps on the delete button.

I have searched for it but don't how it can be implemented. I am posting the code for MainActivity.java class, PlaceDbhelper.java class, and PlacelistAdapter.java class.

MainActivity.java class

    public class MainActivity extends AppCompatActivity implements
    ConnectionCallbacks,
    OnConnectionFailedListener {

// Constants
public static final String TAG = MainActivity.class.getSimpleName();
private static final int PERMISSIONS_REQUEST_FINE_LOCATION = 111;
private static final int PLACE_PICKER_REQUEST = 1;

// Member variables
private PlaceListAdapter mAdapter;
private RecyclerView mRecyclerView;
private boolean mIsEnabled;
private GoogleApiClient mClient;
private Geofencing mGeofencing;

//String arr;


/**
 * Called when the activity is starting
 *
 * @param savedInstanceState The Bundle that contains the data supplied in onSaveInstanceState
 */
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Set up the recycler view
    mRecyclerView = (RecyclerView) findViewById(R.id.places_list_recycler_view);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    mAdapter = new PlaceListAdapter(this, null);
    mRecyclerView=(RecyclerView)findViewById(R.id.places_list_recycler_view);
    mRecyclerView.setAdapter(mAdapter);


    Switch onOffSwitch = (Switch) findViewById(R.id.enable_switch);
    mIsEnabled = getPreferences(MODE_PRIVATE).getBoolean(getString(R.string.setting_enabled), false);
    onOffSwitch.setChecked(mIsEnabled);
    onOffSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit();
            editor.putBoolean(getString(R.string.setting_enabled), isChecked);
            mIsEnabled = isChecked;
            editor.commit();
            if (isChecked) mGeofencing.registerAllGeofences();
            else mGeofencing.unRegisterAllGeofences();
        }

    });


           mClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .addApi(Places.GEO_DATA_API)
            .enableAutoManage(this, this)
            .build();

    mGeofencing = new Geofencing(this, mClient);
    mRecyclerView.addOnItemTouchListener(new RecyclerTouchListener(this,
            mRecyclerView, new ClickListener() {



        public void onClick(View view, final int position) {

            picture.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                }
            });*/

        }
        public void onItemClick(View view, int position) {



        }

        @Override
        public void onLongClick(View view, int position) {

            final AlertDialog alertDialog =new AlertDialog.Builder(MainActivity.this).create();
            alertDialog.setTitle("Are you want to delete this");
            alertDialog.setCancelable(false);
            alertDialog.setMessage("By deleting this, item will permanently be deleted. Are you still want to delete this?");
            alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {



                }
            });
            alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Delete", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {







                }
            });
            alertDialog.show();
            Toast.makeText(MainActivity.this, "Long press on position :"+position,
                    Toast.LENGTH_LONG).show();
        }
    }));




        }

/***
 * Called when the Google API Client is successfully connected
 *
 * @param connectionHint Bundle of data provided to clients by Google Play services
 */
@Override
public void onConnected(@Nullable Bundle connectionHint) {
    refreshPlacesData();
    Log.i(TAG, "API Client Connection Successful!");
}

/***
 * Called when the Google API Client is suspended
 *
 * @param cause cause The reason for the disconnection. Defined by constants CAUSE_*.
 */
@Override
public void onConnectionSuspended(int cause) {
    Log.i(TAG, "API Client Connection Suspended!");
}

/***
 * Called when the Google API Client failed to connect to Google Play Services
 *
 * @param result A ConnectionResult that can be used for resolving the error
 */
@Override
public void onConnectionFailed(@NonNull ConnectionResult result) {
    Log.e(TAG, "API Client Connection Failed!");
}

public void refreshPlacesData() {
    Uri uri = PlaceContract.PlaceEntry.CONTENT_URI;
    Cursor data = getContentResolver().query(
            uri,
            null,
            null,
            null,
            null);

    if (data == null || data.getCount() == 0) return;
    List<String> guids = new ArrayList<String>();
    while (data.moveToNext()) {
        guids.add(data.getString(data.getColumnIndex(PlaceContract.PlaceEntry.COLUMN_PLACE_ID)));
    }
    PendingResult<PlaceBuffer> placeResult = Places.GeoDataApi.getPlaceById(mClient,
            guids.toArray(new String[guids.size()]));
    placeResult.setResultCallback(new ResultCallback<PlaceBuffer>() {
        @Override
        public void onResult(@NonNull PlaceBuffer places) {
            mAdapter.swapPlaces(places);
            mGeofencing.updateGeofencesList(places);
            if (mIsEnabled) mGeofencing.registerAllGeofences();
        }
    });
}


public void onAddPlaceButtonClicked(View view) {
    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION)
            != PackageManager.PERMISSION_GRANTED) {
        Toast.makeText(this, getString(R.string.need_location_permission_message), Toast.LENGTH_LONG).show();
        return;
    }
    try {

        PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder();
        Intent i = builder.build(this);
        startActivityForResult(i, PLACE_PICKER_REQUEST);
    } catch (GooglePlayServicesRepairableException e) {
        Log.e(TAG, String.format("GooglePlayServices Not Available [%s]", e.getMessage()));
    } catch (GooglePlayServicesNotAvailableException e) {
        Log.e(TAG, String.format("GooglePlayServices Not Available [%s]", e.getMessage()));
    } catch (Exception e) {
        Log.e(TAG, String.format("PlacePicker Exception: %s", e.getMessage()));
    }
}


/***
 * Called when the Place Picker Activity returns back with a selected place (or after canceling)
 *
 * @param requestCode The request code passed when calling startActivityForResult
 * @param resultCode  The result code specified by the second activity
 * @param data        The Intent that carries the result data.
 */
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == PLACE_PICKER_REQUEST && resultCode == RESULT_OK) {
        Place place = PlacePicker.getPlace(this, data);
        if (place == null) {
            Log.i(TAG, "No place selected");
            return;
        }

        String placeID = place.getId();

        // Insert a new place into DB
        ContentValues contentValues = new ContentValues();
        contentValues.put(PlaceContract.PlaceEntry.COLUMN_PLACE_ID, placeID);
        getContentResolver().insert(PlaceContract.PlaceEntry.CONTENT_URI, contentValues);

        // Get live data information
        refreshPlacesData();
    }
}

@Override
public void onResume() {
    super.onResume();

    // Initialize location permissions checkbox
    CheckBox locationPermissions = (CheckBox) findViewById(R.id.location_permission_checkbox);
    if (ActivityCompat.checkSelfPermission(MainActivity.this,
            android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        locationPermissions.setChecked(false);
    } else {
        locationPermissions.setChecked(true);
        locationPermissions.setEnabled(false);
    }

    // Initialize ringer permissions checkbox
    CheckBox ringerPermissions = (CheckBox) findViewById(R.id.ringer_permissions_checkbox);
    NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    // Check if the API supports such permission change and check if permission is granted
    if (android.os.Build.VERSION.SDK_INT >= 24 && !nm.isNotificationPolicyAccessGranted()) {
        ringerPermissions.setChecked(false);
    } else {
        ringerPermissions.setChecked(true);
        ringerPermissions.setEnabled(false);
    }
}

public void onRingerPermissionsClicked(View view) {
    Intent intent = new Intent(android.provider.Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
    startActivity(intent);
}

public void onLocationPermissionClicked(View view) {
    ActivityCompat.requestPermissions(MainActivity.this,
            new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
            PERMISSIONS_REQUEST_FINE_LOCATION);
}




public static interface ClickListener{
    public void onClick(View view,int position);
    public void onLongClick(View view,int position);
}


class RecyclerTouchListener implements RecyclerView.OnItemTouchListener{

    private ClickListener clicklistener;
    private GestureDetector gestureDetector;

    public RecyclerTouchListener(Context context, final RecyclerView recycleView, final ClickListener clicklistener){

        this.clicklistener=clicklistener;
        gestureDetector=new GestureDetector(context,new GestureDetector.SimpleOnGestureListener(){
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                return true;
            }

            @Override
            public void onLongPress(MotionEvent e) {
                View child=recycleView.findChildViewUnder(e.getX(),e.getY());
                if(child!=null && clicklistener!=null){
                    clicklistener.onLongClick(child,recycleView.getChildAdapterPosition(child));
                }
            }
        });

    }


    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        View child=rv.findChildViewUnder(e.getX(),e.getY());
        if(child!=null && clicklistener!=null && gestureDetector.onTouchEvent(e)){
            clicklistener.onClick(child,rv.getChildAdapterPosition(child));
        }

        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {

    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
}

}

PlaceDbhelper.java class

public class PlaceDbHelper extends SQLiteOpenHelper {

// The database name
private static final String DATABASE_NAME = "location.db";
PlaceListAdapter obj1;


// If you change the database schema, you must increment the database version
private static final int DATABASE_VERSION = 1;

// Constructor
public PlaceDbHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {

    // Create a table to hold the places data
    final String SQL_CREATE_PLACES_TABLE = "CREATE TABLE " + PlaceEntry.TABLE_NAME + " (" +
            PlaceEntry._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
            PlaceEntry.COLUMN_PLACE_ID + " TEXT NOT NULL, " +
            "UNIQUE (" + PlaceEntry.COLUMN_PLACE_ID + ") ON CONFLICT REPLACE" +
            "); ";

    sqLiteDatabase.execSQL(SQL_CREATE_PLACES_TABLE);
}
 String pe=PlaceEntry._ID.toString();
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
    // For now simply drop the table and create a new one.
    sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + PlaceEntry.TABLE_NAME);
    onCreate(sqLiteDatabase);
   }

PlacelistAdapter.java class

public class PlaceListAdapter extends 
RecyclerView.Adapter<PlaceListAdapter.PlaceViewHolder> {

private Context mContext;
private PlaceBuffer mPlaces;
PlaceDbHelper obj1;
RecyclerView recycleview;

public PlaceListAdapter(Context context, PlaceBuffer places) {
    this.mContext = context;
    this.mPlaces = places;
}


@Override
public PlaceViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    // Get the RecyclerView item layout
    LayoutInflater inflater = LayoutInflater.from(mContext);
    View view = inflater.inflate(R.layout.item_place_card, parent, false);
    //final Activity activity;
    return new PlaceViewHolder(view);
}


@Override
public void onBindViewHolder(PlaceViewHolder holder, int position) {
    String placeName = mPlaces.get(position).getName().toString();
    String placeAddress = mPlaces.get(position).getAddress().toString();
    holder.nameTextView.setText(placeName);
    holder.addressTextView.setText(placeAddress);
}


public void swapPlaces(PlaceBuffer newPlaces) {
    mPlaces = newPlaces;
    if (mPlaces != null) {
        // Force the RecyclerView to refresh
        this.notifyDataSetChanged();
    }
}


@Override
public int getItemCount() {
    if (mPlaces == null) return 0;
    return mPlaces.getCount();
}


/**
 * PlaceViewHolder class for the recycler view item
 */
class PlaceViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    TextView nameTextView;
    TextView addressTextView;

    public PlaceViewHolder(final View itemView) {
        super(itemView);
        nameTextView = (TextView) itemView.findViewById(R.id.name_text_view);
        addressTextView = (TextView) itemView.findViewById(R.id.address_text_view);


    }

    @Override
    public void onClick(View v) {

    }

I have solution for you, you need to delete row from db and then remove from your arraylist and after it notify you adapter. like below.

Use this method in your PlaceDbhelper.java class

public void removePlace(String placeId){
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(PlaceEntry.TABLE_NAME, PlaceEntry.COLUMN_PLACE_ID + "=\"" + placeId+"\"", null) ;
}

now call this method in alert when click DELETE

private void deletePlace(int position){
      PlaceDbhelper dbHelper = new PlaceDbhelper(MainActivity.this);
      dbHelper.removePlace(placeArraylist.get(position).getPlaceId());
      placeArraylist.remove(position);
      mAdapter.notifyDataSetChanged();
}

Hope this will help you, If this solve your problem make it approved. Ask if you need help.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM