首页 > 解决方案 > 为什么我的数据库删除代码不起作用

问题描述

到目前为止,我的数据库程序可以使用提交和显示数据功能。但是删除和修改数据库功能不起作用。我附上了 EventsDB.java 和 EventDetail.java 的代码以及它们的资源布局文件。提交和显示数据部分基本上没有问题。我刚刚完成了修改部分和删除部分的工作。请帮忙。

package com.cinrafood.teopeishen.databasedemo;

import android.content.Intent;
import android.database.SQLException;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    EditText etEvent,etEventDetail,etDate;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);
        etEvent=(EditText)findViewById(R.id.etEvent);
        etEventDetail= (EditText)findViewById(R.id.etEventDetail);
        etDate=(EditText)findViewById(R.id.etDate);
    }
    public void btnSubmit (View view)
    {
        try{
            String event = etEvent.getText().toString();
            String eventDetail = etEventDetail.getText().toString();
            String date= etDate.getText().toString();

            EventsDB db = new EventsDB(this);
            db.open();
            db.createEntry(event,eventDetail,date);
            db.close();
            Toast.makeText(MainActivity.this,"Successfully saved!!",Toast.LENGTH_LONG).show();
            etDate.setText("");
            etEventDetail.setText("");
            etEvent.setText("");
        }catch (SQLException e)
        {
            Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
        }catch (Exception e)
        {
            Toast.makeText(this,"Please fill up all field",Toast.LENGTH_LONG).show();
        }
    }

    public void btnShowEvents (View view)
    {
        startActivity(new Intent(this,EventData.class));
    }


}


package com.cinrafood.teopeishen.databasedemo;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import java.util.ArrayList;

public class EventsDB
{
    public static final String KEY_ROWID ="_id";
    public static final String KEY_EVENT="event_name";
    public static final String KEY_EVENT_DESCRIPTIOM="event_description";
    public static final String KEY_DATE="event_date";


    private final String DATABASE_NAME="EventsDB";
    private final String DATABASE_TABLE="EventsTable";
    private final int DATABASE_VERSION=1;

    private DBHelper ourHelper;
    private final Context ourContext;
    private SQLiteDatabase ourDatabase;
    private ArrayList<Event> events;

    public EventsDB(Context context)
    {
        ourContext= context;
    }
    private class DBHelper extends SQLiteOpenHelper
    {
        public DBHelper (Context context)
        {
            super(context,DATABASE_NAME,null,DATABASE_VERSION);
        }
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS "+DATABASE_TABLE);
            onCreate(db);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            /*
            CREATE TABLE EventsTable (_id INTEGER PRIMARY KEY AUTOINCREMENT,
                event_name TEXT NOT NULL,event_description TEXT NOT NULL,
                event_date DATE NOT NULL);
             */
            String sqlCode="CREATE TABLE "+DATABASE_TABLE+" ("+
                    KEY_ROWID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+
                    KEY_EVENT+" TEXT NOT NULL, "+
                    KEY_EVENT_DESCRIPTIOM+" TEXT NOT NULL, "+
                    KEY_DATE+" TEXT NOT NULL);";
            db.execSQL(sqlCode);
        }
    }

    public EventsDB open() throws SQLException
    {
        ourHelper = new DBHelper(ourContext);
        ourDatabase=ourHelper.getWritableDatabase();
        events= new ArrayList<Event>();

        return this;
    }

    public void close()
    {
        ourHelper.close();
    }

    public long createEntry(String event_name, String event_description, String event_date)

    {
        ContentValues cv = new ContentValues();
        cv.put(KEY_EVENT,event_name);
        cv.put(KEY_EVENT_DESCRIPTIOM,event_description);
        cv.put(KEY_DATE,event_date);
        return ourDatabase.insert(DATABASE_TABLE,null,cv);

    }

    public ArrayList<Event> getData()
    {
        String [] columns = new String[]{KEY_ROWID,KEY_EVENT,KEY_EVENT_DESCRIPTIOM,KEY_DATE};

        Cursor c = ourDatabase.query(DATABASE_TABLE,columns,null,null,null,null,null);
        int iRowID = c.getColumnIndex(KEY_ROWID);
        int iEvent = c.getColumnIndex(KEY_EVENT);
        int iEventDescription = c.getColumnIndex(KEY_EVENT_DESCRIPTIOM);
        int iDate = c.getColumnIndex(KEY_DATE);

        for(c.moveToFirst();!c.isAfterLast();c.moveToNext())
        {
            Event event = new Event(c.getInt(iRowID),c.getString(iEvent),c.getString(iEventDescription),c.getString(iDate));
            events.add(event);

        }

     return events;
    }

    public long deleteEntry (String rowID){
        return ourDatabase.delete(DATABASE_TABLE,KEY_ROWID+"=?",new String[]{rowID});
    }

    public long updateEntry(String rowID, String event_name, String event_description, String event_date)
    {
        ContentValues cv = new ContentValues();
        cv.put(KEY_EVENT,event_name);
        cv.put(KEY_EVENT_DESCRIPTIOM,event_description);
        cv.put(KEY_DATE,event_date);

        return ourDatabase.update(DATABASE_TABLE,cv,KEY_ROWID+"=?",new String[]{rowID});
    }
}

package com.cinrafood.teopeishen.databasedemo;

import android.content.Intent;
import android.database.SQLException;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

public class EventData extends AppCompatActivity {
    ListView lvEvents;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event_data);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        try{

            EventsDB db = new EventsDB(this);
            db.open();
            lvEvents= (ListView)findViewById(R.id.lvEvents);
            lvEvents.setAdapter(new CustomAdapter(db.getData(),getApplicationContext()));
            db.close();
        }catch (SQLException e)
        {
            Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
        }catch(Exception e){
            Toast.makeText(this, e.getMessage(),Toast.LENGTH_LONG).show();
        }

        AdapterView.OnItemLongClickListener click = new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                Intent intent = new Intent(EventData.this,EventDetail.class);
                intent.putExtra("Location",position);
                startActivity(intent);
                return true;
            }
        };
        lvEvents.setOnItemLongClickListener(click);


    }

}


package com.cinrafood.teopeishen.databasedemo;

import android.database.SQLException;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

import java.util.ArrayList;

public class EventDetail extends AppCompatActivity {
    EditText etTitlePage,etEventDetailPage,etDatePage;
    Button btnDeleteEvent;
    int location;

    ArrayList<Event> events;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event_detail);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        etTitlePage=(EditText) findViewById(R.id.etTitlePage);
        etEventDetailPage=(EditText) findViewById(R.id.etEventDetailPage);
        etDatePage=(EditText) findViewById(R.id.etDatePage);
        btnDeleteEvent=(Button)findViewById(R.id.btnDeleteEvent);

        try{

            EventsDB db = new EventsDB(this);
            db.open();
            events=db.getData();
            location = getIntent().getIntExtra("Location",0);
            etTitlePage.setText(events.get(location).getEvent_name());
            etEventDetailPage.setText(events.get(location).getEvent_description());
            etDatePage.setText(events.get(location).getEvent_date());
            db.close();

        }catch (SQLException e)
        {
            Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
        }catch(Exception e){
            Toast.makeText(this, e.getMessage(),Toast.LENGTH_LONG).show();
        }
        btnDeleteEvent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try{

                    EventsDB db = new EventsDB(getApplicationContext());
                    db.open();
                    db.deleteEntry((location+1)+"");
                    db.close();
                    Toast.makeText(getApplicationContext(),"Successfully deleted!!",Toast.LENGTH_LONG).show();

                }catch (SQLException e)
                {
                    Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
                }catch(Exception e){
                    Toast.makeText(getApplicationContext(), e.getMessage(),Toast.LENGTH_LONG).show();
                }
            }
        });


        getSupportActionBar().setDisplayHomeAsUpEnabled(true);


    }


}

标签: androidandroid-sqlite

解决方案


实际上,您已经传递position了该项目ListView以从数据库中删除该项目,这是不正确的。您必须传递rowId数据库主键才能完成删除操作。

AdapterView.OnItemLongClickListener click = new AdapterView.OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {

        //Retrieve Event from adapter
        Event event = lvEvents.getAdapter().getItem(position);

        Intent intent = new Intent(EventData.this,EventDetail.class);
        intent.putExtra("Location", event.getRowId()); // get rowId from event. 
        startActivity(intent);
        return true;
    }
};

并使用它执行delete操作rowId

db.deleteEntry(location + "");

推荐阅读