Android 访问删除方法数据库时应用程序强制关闭
当我访问delete方法时,我的应用程序强制关闭,它可以与insert和get items方法一起正常工作。 在databasehandler中Android 访问删除方法数据库时应用程序强制关闭,android,database,sqlite,android-sqlite,sqliteopenhelper,Android,Database,Sqlite,Android Sqlite,Sqliteopenhelper,当我访问delete方法时,我的应用程序强制关闭,它可以与insert和get items方法一起正常工作。 在databasehandler中 public class DatabaseHandler extends SQLiteOpenHelper { private static final int DB_VERSION = 1; private static final String DB_NAME = "mydb"; private static final String TABLE_
public class DatabaseHandler extends SQLiteOpenHelper {
private static final int DB_VERSION = 1;
private static final String DB_NAME = "mydb";
private static final String TABLE_NAME = "mytable";
private static final String _id = "_id";
private static final String name = "name";
public DatabaseHandler(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String createTableQuery = "create table " + TABLE_NAME + "(" + _id
+ " INTEGER PRIMARY KEY," + name + " TEXT)";
db.execSQL(createTableQuery);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists " + TABLE_NAME);
onCreate(db);
}
public void insertData(String label) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(name, label);
db.insert(TABLE_NAME, null, values);
db.close();
}
public void deleteData(String item){
SQLiteDatabase db =this.getWritableDatabase();
//db.delete(TABLE_NAME, name+ "='" +item +"'", null);
db.execSQL("DELETE FROM TABLE_NAME WHERE name='"+item+"'");
db.close();
}
public Set<String> getAllData() {
Set<String> set = new HashSet<String>();
String selectQuery = "select * from " + TABLE_NAME;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
if (cursor.moveToFirst()) {
do {
set.add(cursor.getString(1));
} while (cursor.moveToNext());
}
cursor.close();
db.close();
return set;
}
}
我的活动
public class ListActivity extends Activity implements OnClickListener,
OnItemSelectedListener {
private EditText edittext;
private Button btnAdd;
DatabaseHandler db;
private Spinner spinner;
ArrayAdapter<String> adapter;
List<String> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.list);
db = new DatabaseHandler(ListActivity.this);
edittext = (EditText) findViewById(R.id.editText1);
btnAdd = (Button) findViewById(R.id.btnadd);
spinner = (Spinner) findViewById(R.id.spinner);
btnAdd.setOnClickListener(this);
spinner.setOnItemSelectedListener(this);
loadSpinner();
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String name = edittext.getText().toString().trim();
if (TextUtils.isEmpty(name)) {
edittext.setError("Enter a valid Message");
edittext.requestFocus();
} else {
db.insertData(name);
edittext.setText("");
// Hiding the keyboard
InputMethodManager inputmangager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputmangager.hideSoftInputFromWindow(edittext.getWindowToken(), 0);
}
Toast.makeText(getApplicationContext(),"Template added Successfully", 0).show();
Intent in = new Intent(ListActivity.this,MainActivity.class);
startActivity(in);
finish();
}
@Override
public void onItemSelected(AdapterView<?> parent, View v, int position,
long id) {
String deleteitem = parent.getItemAtPosition(position).toString();
//db.deleteData(deleteitem);
loadSpinner();
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
private void loadSpinner() {
// TODO Auto-generated method stub
Set<String> set = db.getAllData();
List<String> list = new ArrayList<String>(set);
adapter = new ArrayAdapter<String>(ListActivity.this,
android.R.layout.simple_spinner_item, list);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setWillNotDraw(false);
}
}
公共类ListActivity扩展活动实现OnClickListener,
OnItemSelectedListener{
私人编辑文本;
专用按钮btnAdd;
数据库处理程序数据库;
私人纺纱机;
阵列适配器;
名单;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
setContentView(R.layout.list);
db=新的DatabaseHandler(ListActivity.this);
edittext=(edittext)findViewById(R.id.editText1);
btnAdd=(按钮)findviewbyd(R.id.btnAdd);
微调器=(微调器)findViewById(R.id.spinner);
btnAdd.setOnClickListener(此);
spinner.setOnItemSelectedListener(此);
loadSpinner();
}
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
字符串名称=edittext.getText().toString().trim();
if(TextUtils.isEmpty(name)){
setError(“输入有效消息”);
edittext.requestFocus();
}否则{
db.insertData(名称);
edittext.setText(“”);
//隐藏键盘
InputMethodManager InputManager=(InputMethodManager)getSystemService(Context.INPUT\u方法\u服务);
InputManager.hideSoftInputFromWindow(edittext.getWindowToken(),0);
}
Toast.makeText(getApplicationContext(),“模板添加成功”,0.show();
Intent in=新的Intent(ListActivity.this,MainActivity.class);
星触觉(in);
完成();
}
@凌驾
已选择公共位置(AdapterView父视图、视图v、内部位置、,
长id){
字符串deleteitem=parent.getItemAtPosition(position.toString();
//db.deleteData(deleteitem);
loadSpinner();
}
@凌驾
未选择公共无效(AdapterView arg0){
//TODO自动生成的方法存根
}
私有void加载微调器(){
//TODO自动生成的方法存根
Set=db.getAllData();
列表=新的ArrayList(集合);
适配器=新的ArrayAdapter(ListActivity.this,
android.R.layout.simple\u微调器\u项目,列表);
setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
旋转器。设置适配器(适配器);
spinner.setWillNotDraw(false);
}
}
尝试更改
db.delete(TABLE_NAME, name+ "=" +item, null);
这条线到
db.delete(TABLE_NAME, name+ "=?", new String[] { (item) });
像这样或那样
db.delete(TABLE_NAME, name+ "='" +item+"'", null);
像这样
我想你没有在你的应用程序中使用btnAdd
anywere。如果是,请删除
btnAdd = (Button) findViewById(R.id.btnadd);
这条线。并从中删除注释符号(/
)
这条线
也会改变
String createTableQuery = "create table " + TABLE_NAME + "(" + _id
+ " INTEGER PRIMARY KEY," + name + " TEXT)";
这条线到
String createTableQuery = "create table " + TABLE_NAME + " (" + _id
+ " INTEGER PRIMARY KEY," + name + " TEXT)";
像这样。请注意表名
和(
)之间的空格
让我知道会发生什么。尝试改变
db.delete(TABLE_NAME, name+ "=" +item, null);
这条线到
db.delete(TABLE_NAME, name+ "=?", new String[] { (item) });
像这样或那样
db.delete(TABLE_NAME, name+ "='" +item+"'", null);
像这样
我认为您的应用程序中没有使用任何WARE。如果是,请删除
btnAdd = (Button) findViewById(R.id.btnadd);
并从中删除注释符号(/
)
这条线
也会改变
String createTableQuery = "create table " + TABLE_NAME + "(" + _id
+ " INTEGER PRIMARY KEY," + name + " TEXT)";
这条线到
String createTableQuery = "create table " + TABLE_NAME + " (" + _id
+ " INTEGER PRIMARY KEY," + name + " TEXT)";
注意表名
和(
)之间的空格
然后让我知道发生了什么。只是“像这样丢失了字符串:
db.delete(TABLE_NAME, name+ "='" +item + "'", null);
您正在删除SQL中的一个字符串,您需要在其周围加上“圈”
更新:
只要改变这个:
db.execSQL("DELETE FROM TABLE_NAME WHERE name='"+item+"'");
作者:
只是“缺少以下字符串:
db.delete(TABLE_NAME, name+ "='" +item + "'", null);
您正在删除SQL中的一个字符串,您需要在其周围加上“圈”
更新:
只要改变这个:
db.execSQL("DELETE FROM TABLE_NAME WHERE name='"+item+"'");
作者:
我更喜欢execSQL:
db.execSQL("DELETE FROM x WHERE y='"+z+"'");
我更喜欢execSQL:
db.execSQL("DELETE FROM x WHERE y='"+z+"'");
使用rawQuery添加您的logcat outputcheck,即db.rawQuery(“从表\u name中删除,其中KEY\u name=“+name”);spinner中有多少项?可能您的loadSpinner()有问题方法,因为您删除了唯一的现有表?LOGCAT是您最好的朋友……。@Rob请显示您的
ListActivity
代码,并在其中提及第39行,使用rawQuery添加您的LOGCAT输出检查,即db.rawQuery(“从表名中删除,其中KEY\u name=“+name”);spinner中有多少项?可能您的loadSpinner()有问题方法如果您尝试加载,但没有任何内容可加载,因为您删除了唯一现有的表?LOGCAT是您最好的朋友……。@Rob请显示您的ListActivity
代码,并在其中提及第39行。我尝试了您提到的所有内容。仍然无法解决此问题。按钮问题已取消。请检查LOGCAT i update现在,你可以发布你的表创建方法了吗?现在,如果我从//db.deleteData(deleteitem)中删除//,它会显示force close,否则会很好。我已经添加了我的databasehandler.its工作。此行正在工作。db.delete(table_NAME,NAME+“=?”,新字符串[]{(item)});谢谢Dhanaseelan。我尝试了你提到的所有方法。仍然无法解决。按钮问题已经解决。请检查我现在更新的日志。你能发布你的表创建方法吗?现在如果我从//db.deleteData(deleteitem)中删除//的话;它显示的是强制关闭,否则很好。我已经添加了我的databasehandler.its working。这一行正在运行。db.delete(TABLE_NAME,NAME+“=?”,新字符串[]{(item)});谢谢Dhanaseelan。谢谢,你的方法是完美的。我的方法显示错误是因为字符串值中有标点符号。不知怎的,它现在可以工作了。谢谢,你的方法是完美的。我的方法显示错误是因为字符串值中有标点符号。不知怎的,它现在可以工作了。