2013-05-17 1 views
0

ma force d'application se ferme lorsque j'accède à la méthode de suppression, cela fonctionne correctement avec la méthode insert et get items. à databasehandler,Application force close lorsque j'accède à la base de données de la méthode de suppression

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

et dans mon activité, j'ai cela et

public void onItemSelected(AdapterView<?> parent, View v, int position, 
    long id) { 
    String deleteitem = parent.getItemAtPosition(position).toString(); 
    db.deleteData(deleteitem); 
    loadSpinner(); 
    } 

si je supprimer "db.deleteData (deleteItem)," de mon activité, cela fonctionne sans aucun problème. Je ne sais pas où je me trompe. Tout semble aller bien.

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 

mon activité

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

ajoutez votre sortie logcat –

+0

chèque avec rawQuery-à-dire db.rawQuery ("delete from nom_table où KEY_NAME =" + nom); – Amit

+0

combien d'articles avez-vous dans spinner? peut-être qu'il y a quelque chose qui ne va pas avec la méthode loadSpinner() si vous essayez de charger et qu'il n'y a rien à charger, parce que vous avez supprimé la seule table existante? – Opiatefuchs

Répondre

3

essayer de changer

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

cette ligne à

db.delete(TABLE_NAME, name+ "=?", new String[] { (item) }); 

comme celui-ci ou bien

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

comme ceci.

Je pense que vous n'avez pas utilisé btnAdd anywere dans votre application. Si oui, veuillez supprimer

btnAdd = (Button) findViewById(R.id.btnadd); 

cette ligne. Et supprimer un symbole de commentaire (//) de

//db.deleteData(deleteitem); 

cette ligne.

et aussi changer

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

cette ligne à

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

comme ça. Notez l'espace entre TABLE_NAME et (.

Et laissez-moi savoir ce qui se passe.

+0

J'ai essayé tout ce que vous avez mentionné. ne peut toujours pas le résoudre. Le problème du bouton a été retiré. s'il vous plaît vérifier le logcat j'ai mis à jour maintenant. – Rob

+0

pouvez-vous poster votre méthode de création de table également? – Gunaseelan

+0

maintenant si je supprime // de //db.deleteData(deleteitem); il montre la force proche sinon bien. – Rob

0

Just « manquant dans la chaîne comme ceci:

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

Vous supprimez une chaîne SQL que vous avez besoin de mettre » autour d'elle.

MISE À JOUR:

changer Simplement ceci:

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

par:

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

merci, votre méthode est parfaite. le mien affichait une erreur parce que la valeur de la chaîne contient des signes de ponctuation. en quelque sorte cela fonctionne maintenant. – Rob

0

Je préférerais execSQL:

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