2013-05-17 1 views
0

моя сила приложения закрывается, когда я обращаюсь к методу удаления, он отлично работает с методом вставки и получения элементов. в 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_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 void onItemSelected(AdapterView<?> parent, View v, int position, 
    long id) { 
    String deleteitem = parent.getItemAtPosition(position).toString(); 
    db.deleteData(deleteitem); 
    loadSpinner(); 
    } 

если я удалить "db.deleteData (DeleteItem);" от моей деятельности, она работает без каких-либо проблем. Я не знаю, где я ошибаюсь. все кажется прекрасным.

05-17 16:44:01.855: E/AndroidRuntime(1936): FATAL EXCEPTION: main 
05-17 16:44:01.855: E/AndroidRuntime(1936): android.database.sqlite.SQLiteException: no such table: TABLE_NAME: DELETE FROM TABLE_NAME WHERE name='Hi i am not available now. i will contact you soon.' 
05-17 16:44:01.855: E/AndroidRuntime(1936): at android.database.sqlite.SQLiteDatabase.native_execSQL(Native Method) 
    05-17 16:44:01.855: E/AndroidRuntime(1936): at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1763) 
    05-17 16:44:01.855: E/AndroidRuntime(1936): at com.praveenkutti1990.ezmesseger.DatabaseHandler.deleteData(DatabaseHandler.java:50) 
    05-17 16:44:01.855: E/AndroidRuntime(1936): at com.praveenkutti1990.ezmesseger.ListActivity.onItemSelected(ListActivity.java:90) 
05-17 16:44:01.855: E/AndroidRuntime(1936): at android.widget.AdapterView.fireOnSelected(AdapterView.java:871) 
    05-17 16:44:01.855: E/AndroidRuntime(1936): at android.widget.AdapterView.access$200(AdapterView.java:42) 
    05-17 16:44:01.855: E/AndroidRuntime(1936): at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:837) 
    05-17 16:44:01.855: E/AndroidRuntime(1936): at android.os.Handler.handleCallback(Handler.java:587) 
    05-17 16:44:01.855: E/AndroidRuntime(1936): at android.os.Handler.dispatchMessage(Handler.java:92) 
    05-17 16:44:01.855: E/AndroidRuntime(1936): at android.os.Looper.loop(Looper.java:123) 
    05-17 16:44:01.855: E/AndroidRuntime(1936): at android.app.ActivityThread.main(ActivityThread.java:3683) 
    05-17 16:44:01.855: E/AndroidRuntime(1936): at java.lang.reflect.Method.invokeNative(Native Method) 
    05-17 16:44:01.855: E/AndroidRuntime(1936): at java.lang.reflect.Method.invoke(Method.java:507) 
    05-17 16:44:01.855: E/AndroidRuntime(1936): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
    05-17 16:44:01.855: E/AndroidRuntime(1936): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
    05-17 16:44:01.855: E/AndroidRuntime(1936): at dalvik.system.NativeStart.main(Native Method) 
    05-17 16:44:03.945: I/Process(1936): Sending signal. PID: 1936 SIG: 9 

моя деятельность

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); 

} 

    } 
+0

добавить LogCat выходной –

+0

чек с rawQuery т.е. db.rawQuery («удалить из table_name, где KEY_NAME =» + имя); – Amit

+0

Сколько у вас предметов в прядильщике? возможно, что-то случилось с вами методом loadSpinner(), если вы пытаетесь загрузить и загружать нечего, потому что вы удалили только существующую таблицу? – Opiatefuchs

ответ

3

попытка изменить

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); 

этот номер. И удалить символ комментария (//) от

//db.deleteData(deleteitem); 

эта линия.

, а также изменить

String createTableQuery = "create table " + TABLE_NAME + "(" + _id 
      + " INTEGER PRIMARY KEY," + name + " TEXT)"; 

эта линия

String createTableQuery = "create table " + TABLE_NAME + " (" + _id 
      + " INTEGER PRIMARY KEY," + name + " TEXT)"; 

как это. обратите внимание на пробел между TABLE_NAME и (.

И дайте мне знать, что произойдет.

+0

Я попробовал все, что вы упомянули. все еще не может его решить. кнопка была снята. пожалуйста, проверьте обновленный logcat i. – Rob

+0

Вы также можете опубликовать свой метод создания таблицы? – Gunaseelan

+0

теперь, если я удаляю // из //db.deleteData(deleteitem); он демонстрирует силу, близкую в противном случае. – Rob

0

Просто «пропущенный вокруг строки, как это:

db.delete(TABLE_NAME, name+ "='" +item + "'", null); 

Вы удаляете строку в SQL нужно поставить» вокруг него.

UPDATE:

Просто измените это:

db.execSQL("DELETE FROM TABLE_NAME WHERE name='"+item+"'"); 

по:

db.execSQL("DELETE FROM " + TABLE_NAME + " WHERE name='"+item+"'"); 
+0

спасибо, ваш метод совершенен. моя показывала ошибку, потому что в этом строковом значении есть знаки препинания. так или иначе это работает сейчас. – Rob

0

Я предпочел бы ExecSQL:

db.execSQL("DELETE FROM x WHERE y='"+z+"'");