Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Android中删除SQLite中的一行_Java_Android_Database_Sqlite - Fatal编程技术网

Java 在Android中删除SQLite中的一行

Java 在Android中删除SQLite中的一行,java,android,database,sqlite,Java,Android,Database,Sqlite,我正在尝试从players表中删除一行,该表中的每一行都只有players name和id。我觉得这可能是我明显遗漏的东西,但就是看不出我错在哪里 麦可德 DatabaseHelper.java public Integer deletePlayer(String id) { SQLiteDatabase db = this.getWritableDatabase(); return db.delete(PLAYERS_TABLE, "id =?", new String[]{i

我正在尝试从players表中删除一行,该表中的每一行都只有players name和id。我觉得这可能是我明显遗漏的东西,但就是看不出我错在哪里

麦可德

DatabaseHelper.java

public Integer deletePlayer(String id) {
    SQLiteDatabase db = this.getWritableDatabase();
    return db.delete(PLAYERS_TABLE, "id =?", new String[]{id});
}
ManagePlayers.java

我使用的是LongClickListener,因此应用程序的用户可以从列表视图中删除任何播放器

playersListView.setOnItemLongClickListener(
            new AdapterView.OnItemLongClickListener() {
                @Override
                public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                    removeItemFromList(position);
                    return true;
                }
            }
    );


 public void removeItemFromList(int position) {
    final int deletePosition = position;

    AlertDialog.Builder alert = new AlertDialog.Builder(
            ManagePlayers.this);

    alert.setTitle(getString(R.string.delete_player));
    alert.setMessage(getString(R.string.are_sure_delete_player));
    alert.setPositiveButton(R.string.positiveAnswer, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
           //these three lines delete the listview row
            playerNameArrayList.remove(deletePosition);
            myArrayAdapter.notifyDataSetChanged();
            myArrayAdapter.notifyDataSetInvalidated();

            if (dbh.deletePlayer(String.valueOf(deletePosition)) > 0) {
                Toast.makeText(ManagePlayers.this, "Player Deleted", Toast.LENGTH_LONG).show();
                finish();
            } else
                Toast.makeText(ManagePlayers.this,  "Player NOT Deleted", Toast.LENGTH_LONG).show();
        }
    });

    alert.setNegativeButton(R.string.negativeAnswer, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
        }
    });

    alert.show();
}
你能告诉我怎样才能成功地从我的玩家表中删除行吗

Thks


Sean

您遇到的一个问题是将列表中的位置与行的id相等。这两者很少(如果有的话)是相同的

添加新行时,如果该行是rowid的别名,则该行的id为,也就是说,该列已使用列类型声明为整数主键或整数主键AUTOINCREMENT可能是1,然后是2,然后是3等。但是列表中的第一个位置将是0,然后是1,然后是2

因此,假设您有以下几点:-

然后以列表的形式呈现玩家,然后:-

玩家Fred id=1将处于位置0。 玩家Bert id=2将处于位置1。 等等 一些人认为他们可以通过在位置上增加1来补偿。但是,如果Fred被删除,则不会:-

玩家Bert id=2处于位置0。 玩家Harry id=3处于位置1。 现在位置和id之间的差值是2。然而,假设汤姆被删除了

玩家Bert id=2处于位置0。 玩家Harry id=3处于位置1。 玩家迪克id=5处于位置2。 你需要确定正确的身份证,这可能意味着列表playerNameArrayList的源包含id,或者可能包含/访问一个互补数组,即元素0将包含/访问第一个播放器的if等,然后使用该位置从相应数组元素获取id


另一种方法是在列表视图中使用游标适配器,在这种情况下,游标中的id note id列必须是_id作为第四个参数提供给ONITIMLONGCLICK。如果不是游标适配器,则是位置。

Mike的可能副本感谢一百万次澄清这一点-正如您所说,id确实从1开始。谢谢。