2013-05-17 32 views
0

當我訪問delete方法時,我的應用程序強制關閉,它可以正常使用insert和get items方法。 在數據庫處理器,當我訪問刪除方法數據庫時,應用程序強制關閉

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

與rawQuery即添加您的logcat輸出 –

+0

檢查db.rawQuery (「從表名刪除where KEY_NAME =」+ 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任何東西。如果是,請刪除

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

這樣。請注意0​​和(之間的空格。

讓我知道會發生什麼。

+0

我試過你提到的一切。仍然無法解決它。按鈕問題已被取消。請檢查我現在更新的logcat。 – 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+"'"); 
相關問題