【问题标题】:Delete a row from SQLite DataBase doesn't work从 SQLite 数据库中删除一行不起作用
【发布时间】:2013-09-11 12:43:45
【问题描述】:

我在列表视图中显示来自数据库的数据,当用户在一行中长按然后在对话框中选择“是”时,我想删除一个条目。我有所有的代码,它可以编译,但它没有删除任何东西。有什么建议吗?谢谢

这是listview的代码:

public class Consult extends FragmentActivity { 
    private ListView list;
    private SQLiteDatabase db;
    private int id = 0;

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

        list = (ListView)findViewById(R.id.list);

        this.getIntent();

        ApeironsSQLiteHelper apeironsdb = new ApeironsSQLiteHelper(this, "DBApeirons.DB", null, 1);

        db = apeironsdb.getWritableDatabase();

        String[] campos = new String[]{"_id", "name", "kind_place", "score"};

        Cursor c = db.query("Apeirons", campos, null, null, null, null, null);

        c.moveToFirst();

        String[] from = new String[]{"name", "kind_place", "score"};

        int [] to = new int[] {R.id.Titulo, R.id.SubTitulo};

        //@SuppressWarnings("deprecation")
        MyListAdapter myadapter = new MyListAdapter (this, 
                R.layout.entrys, c, from, to);

        list.setAdapter(myadapter);

        list.setLongClickable(true);
        list.setOnItemLongClickListener(new OnItemLongClickListener(){
            public boolean onItemLongClick(AdapterView<?> arg0, View v,
                    int index, long arg3) {
                saveID(index);
                //db.delete("Apeirons", "_id=" + String.valueOf(index), null);
                Log.d("ONCLICK", String.valueOf(index));
                Log.d("ONCLICK", String.valueOf(id));
                callDialog();
                return false;
            }
        });

    }
    public void callDialog(){
        Log.d("DIALOG", String.valueOf(id));
        FragmentManager fragmentmanager = getSupportFragmentManager();
        SimpleDialog dialog = new SimpleDialog();
        dialog.saveIndex(id);
        //SimpleDialog.newInstance(id);
        dialog.show(fragmentmanager, "tag");
        Log.d("erase", "salgo del callDialog");
    }
    public void saveID(int ID){
        id = ID;
    }

这就是对话框的代码:

public class SimpleDialog extends DialogFragment {

    private SQLiteDatabase dbs;
    int ID;
    @Override
    public Dialog onCreateDialog (Bundle savedInstanceState){

        //ID = getArguments().getInt("id");

        ApeironsSQLiteHelper apeironsdbs = new ApeironsSQLiteHelper(getActivity(), 
                "DBApeirons.DB", null, 1);
        dbs = apeironsdbs.getWritableDatabase();

        AlertDialog.Builder builder = 
                new AlertDialog.Builder(getActivity());


        builder.setMessage(R.string.EraseDialogMessage);
        builder.setTitle(R.string.app_name);
        builder.setPositiveButton(R.string.EraseDialogPButton, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                String args = String.valueOf(ID);
                Log.d("Yes BUTTON", args);
                /*String sql = "DELETE FROM Apeirons WHERE _id=" + args;
                dbs.execSQL(sql);*/
                //int prueba = dbs.delete("Apeirons", " _id = ?" + args, null);
                int prueba = dbs.delete("Apeirons", "_id = ?", new String[] { "" + args });
                Log.d("RETORNO DELETE", String.valueOf(prueba));
            }
        });

        builder.setNegativeButton(R.string.EraseDialogNButton, new DialogInterface.OnClickListener() {  
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();

            }
        });
        return builder.create();
    }

    public void saveIndex(int index){
        ID = index;
    }


}

我修好了!!!问题是我使用的是列表视图的 id,它在数据库中不一样。现在我首先恢复数据库的 _id 并完美运行。谢谢你的所有答案。下面是恢复数据库_id的代码(可能对某人有用):

list.setLongClickable(true);
        list.setOnItemLongClickListener(new OnItemLongClickListener(){
            public boolean onItemLongClick(AdapterView<?> arg0, View v,
                    int index, long arg3) {
                c.moveToPosition(index);
                int id = c.getInt(c.getColumnIndex("_id"));
                saveID(id);
                Log.d("ONCLICK", String.valueOf(index));
                Log.d("ONCLICK", String.valueOf(id));
                callDialog();
                return false;
            }
        });

【问题讨论】:

    标签: android sqlite delete-row


    【解决方案1】:

    你可以试试

    private SQLiteDatabase dbs;
    String args = String.valueOf(ID);
    

    删除查询:

    方法一:

    dbs = apeironsdbs.getWritableDatabase();
    String deleteQuery = "DELETE FROM Apeirons where _id='"+ args +"'";       
    dbs .execSQL(deleteQuery);
    

    或者你可以使用

    方法二:

    ApeironsSQLiteHelper apeironsdb = new ApeironsSQLiteHelper(this, "DBApeirons.DB", null, 1);    
    apeironsdb .delete(Apeirons, _id+"="+ID, null);   // ID is int value
    

    【讨论】:

    • 真的很感谢@Ritesh Gune,我都试过了,但还是不行,我不明白为什么。原木猫没有说任何有趣的东西,只是我打印的信息和编舞者的一些信息。你还有什么想法吗?
    • 我认为错误是我使用了游标的 id,我需要数据库的 _id,有时它们不一样。你知道我怎样才能恢复那个 _id 吗?
    【解决方案2】:

    尝试更改此行:

    int prueba = dbs.delete("Apeirons", " _id = ?" + args, null);
    

    进入

    int prueba = dbs.delete("Apeirons", " _id = \"" + args + "\"", null);
    

    【讨论】:

    • 真的谢谢你,我试过了,但还是不行。我认为错误是我使用了游标的 id,我需要数据库的 _id,有时它们不一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 2011-08-24
    • 2012-03-17
    • 2016-11-09
    • 2016-03-10
    • 2018-06-23
    相关资源
    最近更新 更多