SQLite 删除功能有效但不删除条目
SQLite Delete function working but not deleting entry
记录是从 ListView 中选择的,然后可以单击该记录,通过对话框提示用户查看他们是要确认还是取消。
然后应删除该记录并更新 ListView。但是,尽管提供的教程与我的代码相匹配,但到目前为止我还无法实现这一目标。应用程序没有崩溃但是对话框后刷新了页面但是没有删除记录?
删除记录活动
public class DeleteRecordActivity extends AppCompatActivity
{
OpenDatabase sqh;
SQLiteDatabase sqdb;
ListView deleteRecordListView;
Button backButtonDelete;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_delete_record);
InitDatabase();
setupControls();
} // protected void onCreate(Bundle savedInstanceState)
public void InitDatabase()
{
sqh = new OpenDatabase(this);
sqdb = sqh.getWritableDatabase();
} // public void InitDatabase()
protected void setupControls()
{
backButtonDelete = findViewById(R.id.backButtonDelete);
backButtonDelete.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
finish();
}
});
setupListView();
} // protected void setupControls()
protected void setupListView()
{
deleteRecordListView = findViewById(R.id.deleteRecordListview);
ArrayList<String> list = new ArrayList<String>();
list.addAll( sqh.allFilmsReturnArrayList( sqdb ));
ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, list);
deleteRecordListView.setAdapter( adapter );
deleteRecordListView.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
String item = (String) parent.getItemAtPosition(position);
// String[] subString = item.split(",");
// sqh.deleteRecordFromFilmography( sqdb, subString[0] );
deleteRecordDialog( item );
Log.i("RECORD", "Record = " + item);
refreshListView();
}
});
} // protected void setupListView()
protected void refreshListView()
{
ArrayList<String> list = new ArrayList<String>();
list.addAll( sqh.allFilmsReturnArrayList( sqdb ));
ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, list);
deleteRecordListView.setAdapter( adapter );
} // protected void refreshListView()
protected void deleteRecordDialog(String selectedRecord)
{
String[] subString = selectedRecord.split(",");
Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.dialog_layout);
TextView recordTextView = dialog.findViewById(R.id.recordTextView);
recordTextView.setText( selectedRecord );
Button yesButton = dialog.findViewById(R.id.yesButton);
yesButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
sqh.deleteRecordFromFilmography( sqdb, subString[0] );
dialog.dismiss();
refreshListView();;
}
});
Button noButton = dialog.findViewById(R.id.noButton);
noButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
dialog.dismiss();
}
});
dialog.show();
} // protected void deleteRecordDialog(String selectedRecord)
} // public class DeleteRecordActivity extends AppCompatActivity
OpenDatabase中的调用方法class:
public void deleteRecordFromFilmography(SQLiteDatabase sqdb, String id)
{
String deleteQuery = "DELETE FROM filmography WHERE id = '" + id + ";'";
sqdb.execSQL( deleteQuery );
} // public void deleteRecordfromFilmography(SQLiteDatabase sqdb, String id)
我不知道你在看哪个教程,但我的建议是停下来找别的东西。
您的代码问题只是一个拼写错误:
String deleteQuery = "DELETE FROM filmography WHERE id = '" + id + "';";
而不是:
String deleteQuery = "DELETE FROM filmography WHERE id = '" + id + ";'";
但是通过修复你只会学会使用不安全的代码并且容易出现这样的拼写错误。
您的代码不安全,因为您将参数连接到 sql 代码。
这始终是一个坏主意,并且会带来 sql injection.
的风险
对参数使用 ?
占位符。
推荐的删除行的方法是不是execSQL()
but delete()
:
public void deleteRecordFromFilmography(SQLiteDatabase sqdb, String id) {
sqdb.delete("filmography", "id = ?", new String[] {id});
}
第一个参数是 table 的名称,第二个是不带 WHERE
关键字的 WHERE
子句,第三个参数是包含值的字符串数组参数(?
占位符)在您的情况下仅为 1。
记录是从 ListView 中选择的,然后可以单击该记录,通过对话框提示用户查看他们是要确认还是取消。 然后应删除该记录并更新 ListView。但是,尽管提供的教程与我的代码相匹配,但到目前为止我还无法实现这一目标。应用程序没有崩溃但是对话框后刷新了页面但是没有删除记录?
删除记录活动
public class DeleteRecordActivity extends AppCompatActivity
{
OpenDatabase sqh;
SQLiteDatabase sqdb;
ListView deleteRecordListView;
Button backButtonDelete;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_delete_record);
InitDatabase();
setupControls();
} // protected void onCreate(Bundle savedInstanceState)
public void InitDatabase()
{
sqh = new OpenDatabase(this);
sqdb = sqh.getWritableDatabase();
} // public void InitDatabase()
protected void setupControls()
{
backButtonDelete = findViewById(R.id.backButtonDelete);
backButtonDelete.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
finish();
}
});
setupListView();
} // protected void setupControls()
protected void setupListView()
{
deleteRecordListView = findViewById(R.id.deleteRecordListview);
ArrayList<String> list = new ArrayList<String>();
list.addAll( sqh.allFilmsReturnArrayList( sqdb ));
ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, list);
deleteRecordListView.setAdapter( adapter );
deleteRecordListView.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
String item = (String) parent.getItemAtPosition(position);
// String[] subString = item.split(",");
// sqh.deleteRecordFromFilmography( sqdb, subString[0] );
deleteRecordDialog( item );
Log.i("RECORD", "Record = " + item);
refreshListView();
}
});
} // protected void setupListView()
protected void refreshListView()
{
ArrayList<String> list = new ArrayList<String>();
list.addAll( sqh.allFilmsReturnArrayList( sqdb ));
ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, list);
deleteRecordListView.setAdapter( adapter );
} // protected void refreshListView()
protected void deleteRecordDialog(String selectedRecord)
{
String[] subString = selectedRecord.split(",");
Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.dialog_layout);
TextView recordTextView = dialog.findViewById(R.id.recordTextView);
recordTextView.setText( selectedRecord );
Button yesButton = dialog.findViewById(R.id.yesButton);
yesButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
sqh.deleteRecordFromFilmography( sqdb, subString[0] );
dialog.dismiss();
refreshListView();;
}
});
Button noButton = dialog.findViewById(R.id.noButton);
noButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
dialog.dismiss();
}
});
dialog.show();
} // protected void deleteRecordDialog(String selectedRecord)
} // public class DeleteRecordActivity extends AppCompatActivity
OpenDatabase中的调用方法class:
public void deleteRecordFromFilmography(SQLiteDatabase sqdb, String id)
{
String deleteQuery = "DELETE FROM filmography WHERE id = '" + id + ";'";
sqdb.execSQL( deleteQuery );
} // public void deleteRecordfromFilmography(SQLiteDatabase sqdb, String id)
我不知道你在看哪个教程,但我的建议是停下来找别的东西。
您的代码问题只是一个拼写错误:
String deleteQuery = "DELETE FROM filmography WHERE id = '" + id + "';";
而不是:
String deleteQuery = "DELETE FROM filmography WHERE id = '" + id + ";'";
但是通过修复你只会学会使用不安全的代码并且容易出现这样的拼写错误。
您的代码不安全,因为您将参数连接到 sql 代码。
这始终是一个坏主意,并且会带来 sql injection.
对参数使用 ?
占位符。
推荐的删除行的方法是不是execSQL()
but delete()
:
public void deleteRecordFromFilmography(SQLiteDatabase sqdb, String id) {
sqdb.delete("filmography", "id = ?", new String[] {id});
}
第一个参数是 table 的名称,第二个是不带 WHERE
关键字的 WHERE
子句,第三个参数是包含值的字符串数组参数(?
占位符)在您的情况下仅为 1。