Команда: «Удалить из таблицы, где ...» не работает - PullRequest
0 голосов
/ 15 мая 2019

Я не могу удалить некоторые данные из моей таблицы в базе данных.

Я скопировал код SQLite и вставил его в свой новый проект.Это довольно просто.Я исправляю некоторый код, и он не работает.

Я трачу много времени на решение этой проблемы, но не могу это сделать.

Даже без ошибок произошло.

За исключением запроса на удаление, все остальные запросы работают довольно хорошо.

Это основано на Android и Java.

Я пытался удалить данные, используя этизапросов.

db.execSQL("DELETE FROM mca WHERE position=" + position + ";");
db.execSQL("DELETE FROM mca WHERE _id=" + id + ";");
db.execSQL("DELETE FROM mca WHERE member='" + member + "';");

Я сделал _id, позиция и член имеют одинаковое значение.Так что эти коды имеют смысл.

_id и position - INTEGER, а member - TEXT.

Это MainActivity.java

public class MainActivity extends AppCompatActivity {

    RecyclerView recyclerView;
    MyRecyclerViewAdapter adapter;

    MemberData md;


    @Override
    protected void onCreate(Bundle savedInstanstState) {
        super.onCreate(savedInstanstState);
        setContentView(R.layout.activity_main);
        final DBHelper dbHelper = new DBHelper(getApplicationContext(), "test_alarm.db", null, 1);
        ArrayList<MemberData> member;


        member = new ArrayList<>();

        for (int i = 1; i < 5; i++) {
            try {
                md = new MemberData(member.get(member.size() - 1).position + 1, i + "");

            }catch(Exception e){
                Log.d("error", e+"");
                md = new MemberData(1, i+"");
            }
            member.add(md);
            dbHelper.insert(md);


        }

        /*************** activate delete command ***************/
        dbHelper.delete(2);
        /*******************************************************/

        // set up the RecyclerView
        recyclerView = findViewById(R.id.my_recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        adapter = new MyRecyclerViewAdapter(this, member, dbHelper);
        recyclerView.setAdapter(adapter);

    }
}

class MemberData {
    public int position;
    public String member;

    public MemberData(int position, String member) {
        this.member = member;
        this.position = position;
    }
}

Это функция SQLite

public class DBHelper extends SQLiteOpenHelper {

    public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE mca (_id INTEGER PRIMARY KEY AUTOINCREMENT, member TEXT, position INTEGER);");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

    public void insert(MemberData md) {
        SQLiteDatabase db = getWritableDatabase();
        db.execSQL("INSERT INTO mca VALUES(null, '" + md.member + "', " + md.position + ");");
        db.close();

    }

    public void delete(int position) {
        SQLiteDatabase db = getWritableDatabase();
        /********************* Delete query *******************/
        db.execSQL("DELETE FROM mca WHERE position=" + position + ";");
        /*******************************************************/

        db.close();
    }

    public ArrayList<MemberData> getData() {
        SQLiteDatabase db = getReadableDatabase();

        ArrayList<MemberData> memberList = new ArrayList<>();

        Cursor cursor = db.rawQuery("SELECT * FROM mca", null);
        while (cursor.moveToNext()) {
            memberList.add(new MemberData(cursor.getInt(1), cursor.getString(2)));
        }
        return memberList;
    }

}

Это адаптер для RecyclerView.

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder> {

    private ArrayList<MemberData> mData;
    private LayoutInflater mInflater;
    private ItemClickListener mClickListener;
    private DBHelper db;

    // stores and recycles views as they are scrolled off screen
    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView myTextView;

        public ViewHolder(View itemView) {
            super(itemView);
            myTextView = itemView.findViewById(R.id.textView);

            itemView.setOnClickListener(this);

        }

        @Override
        public void onClick(View view) {
            if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
        }
    }

    // data is passed into the constructor
    MyRecyclerViewAdapter(Context context, ArrayList<MemberData> data, DBHelper db) {
        this.mInflater = LayoutInflater.from(context);
        this.mData = data;
        this.db = db;
    }

    // inflates the row layout from xml when needed
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.my_text_view, parent, false);
        return new ViewHolder(view);
    }

    // binds the data to the TextView in each row
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        String member = "member"+mData.get(position).member;
        holder.myTextView.setText(member);
    }

    // total number of rows
    @Override
    public int getItemCount() {
        return mData.size();
    }

    // convenience method for getting data at click position
    String getItem(int id) {
        return mData.get(id).member;
    }

    // allows clicks events to be caught
    void setClickListener(ItemClickListener itemClickListener) {
        this.mClickListener = itemClickListener;
    }

    // parent activity will implement this method to respond to click events
    public interface ItemClickListener {
        void onItemClick(View view, int position);
    }
}

Я просто хочу удалить определенное значение из таблицы

Ответы [ 4 ]

3 голосов
/ 15 мая 2019
db.execSQL("DELETE FROM mca WHERE position='" + position + "'");
db.execSQL("DELETE FROM mca WHERE _id='" + id + "'");
db.execSQL("DELETE FROM mca WHERE member='" + member + "'");

попробуйте это

будьте осторожны с «» и «;»

2 голосов
/ 15 мая 2019

Всегда используйте ' при использовании переменной в запросах SQLite. также удалите ";"

Например: вы использовали position, поэтому определите его как

 db.execSQL("DELETE FROM mca WHERE position='" + position + "'");
 db.execSQL("DELETE FROM mca WHERE _id='" + id + "'");
 db.execSQL("DELETE FROM mca WHERE member='" + member + "'");
1 голос
/ 15 мая 2019

используйте db.delete возвращает 0 для ошибки 1 для успеха

    public int delete(String position) {
    SQLiteDatabase db = getWritableDatabase();
    return db.delete("mca","position = ?",new String[] {position});
    db.close();
    }
0 голосов
/ 15 мая 2019

Вы должны изменить свой код sql, как показано ниже.

Когда вы используете переменную внутри запроса sql, вам необходимо связать значение переменной и запрос sql в виде одной строки.

попробуйте код ниже.

db.execSQL("DELETE FROM mca WHERE position='" + position + "';");
db.execSQL("DELETE FROM mca WHERE _id='" + id + "';");
db.execSQL("DELETE FROM mca WHERE member='" + member + "';"); 
...