我有一个微调器,它显示来自数据库 SQLite 的数据列表。我想在选择时从 Spinner 和 db 中删除一行,然后单击按钮 btn。我怎样才能做到这一点?谢谢
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.remove_wf2);
mDB = new MyDatabase(getApplicationContext());
mDB.open();
spin = (Spinner)findViewById(R.id.wf_spinner);
c = mDB.fetchWfs();
startManagingCursor(c);
// create an array to specify which fields we want to display
String[] from = new String[]{WfMetaData.WF_NAME_KEY};
// create an array of the display item we want to bind our data to
int[] to = new int[]{android.R.id.text1};
// create simple cursor adapter
adapter =
new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, c, from, to );
adapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item );
// get reference to our spinner
spin.setAdapter(adapter);
spin.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int pos, long id) {
spinnerPos = pos;
mRowId = id; // database row id
}
});
//fillSpinner(spin);
Button btn = (Button)findViewById(R.id.button11);
btn.setText("Rimuovi");
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mDB.delete_byID(mRowId);
c.requery();
}
});
/*
Spinner spin = (Spinner)findViewById(R.id.wf_spinner);
Cursor cur = mDB.fetchWfs();
startManagingCursor(cur);
String[] from = new String[] { WfMetaData.WF_NAME_KEY };
int[] to = new int[] { android.R.id.text1 };
SimpleCursorAdapter spinAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, cur, from, to);
spinAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spin.setAdapter(spinAdapter);
spin.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
Cursor c = (Cursor)parent.getItemAtPosition(pos);
mSpinnerWF = c.getInt(c.getColumnIndexOrThrow(WfMetaData.WF_NAME_KEY));
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});*/
//mDB.close();
}
我的删除方法是这样的:
public boolean delete_byID(long rowId) {
return mDb.delete(WfMetaData.WF_TABLE, WfMetaData.WF_NAME_KEY + "=" + rowId, null) > 0;
CharSequence text = "Il Workflow "+ n +" è stato rimosso con successo!";
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(mContext, text, duration);
toast.show();
}
我没有从 ID 中找到任何删除方法。这是一种数据库方法吗?
我已经像这样修改了我的应用程序:
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.remove_wf2);
mDB = new MyDatabase(getApplicationContext());
mDB.open();
spin = (Spinner)findViewById(R.id.wf_spinner);
c = mDB.fetchWfs();
startManagingCursor(c);
// create an array to specify which fields we want to display
String[] from = new String[]{WfMetaData.WF_NAME_KEY};
// create an array of the display item we want to bind our data to
int[] to = new int[]{android.R.id.text1};
// create simple cursor adapter
adapter =
new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, c, from, to );
adapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item );
// get reference to our spinner
spin.setAdapter(adapter);
spin.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int pos, long id) {
spinnerPos = pos;
mRowId = id; // database row id
}
});
//fillSpinner(spin);
mDB.close();
Button btn = (Button)findViewById(R.id.button11);
btn.setText("Rimuovi");
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
adapter.getItem(spinnerPos);
mDB.delete_byName((String)adapter.getItem(spinnerPos));
c.requery();
}
});
但我在 LogCat(Cast 异常)中收到此错误:
05-10 15:46:38.586: D/RadioSignalLevel(1758): Gsm Radio Signal level: 4
05-10 15:46:38.586: D/StatusBarPolicy(1758): ERI alert sound is disabled.
05-10 15:46:38.606: D/NetworkService(1939): handle message:800
05-10 15:46:38.606: D/NetworkService(1939): getRawGPRSRegistrationState
05-10 15:46:38.616: I/TransactionService(29090): MMS-STATUS - start transaction service, app version=STABLE4.5.user.4.5.2A-74_OLE-31.2.3.4.Blur_Version.45.31.0.MB860.TIM.en.IT.Thu Sep 22 04:02:02 CST 2011 (log=false) (apn=false) (config=false)
05-10 15:46:38.626: I/SmsReceiverService(29090): MMS-STATUS - start sms receiver service, app version=STABLE4.5.user.4.5.2A-74_OLE-31.2.3.4.Blur_Version.45.31.0.MB860.TIM.en.IT.Thu Sep 22 04:02:02 CST 2011 (log=false) (apn=false) (config=false)
05-10 15:46:38.636: I/TelephonyRegistry(1610): notifyDataConnection: state=0 isDataConnectivityPossible=false reason=nwTypeChanged interfaceName=null networkType=10
05-10 15:46:38.636: I/SYS_MPP(1965): WebtopStatusHandler updateDataIcon()
05-10 15:46:38.646: D/NetworkService(1939): handle message:800
05-10 15:46:38.646: D/NetworkService(1939): getRawGPRSRegistrationState
05-10 15:46:38.646: I/CBStartup(1939): onServiceStateChanged
05-10 15:46:38.656: I/CBSettings(1939): Reading database: KEY_NAME= db_key_language
05-10 15:46:38.656: I/CBSettings(1939): Reading database: KEY_NAME= db_key_channel
public class MyDatabase {
SQLiteDatabase mDb;
DbHelper mDbHelper;
Context mContext;
private static final String DEBUG_TAG = "WFListDatabase";
private static final String DB_NAME="WFListdb";//nome del db
private static final int DB_VERSION=1; //numero di versione del nostro db
public MyDatabase(Context ctx) {
mContext = ctx;
mDbHelper = new DbHelper(ctx, DB_NAME, null, DB_VERSION); //quando istanziamo questa classe, istanziamo anche l'helper (vedi sotto)
}
public void open(){ //il database su cui agiamo è leggibile/scrivibile
mDb=mDbHelper.getWritableDatabase();
}
public void close(){ //chiudiamo il database su cui agiamo
mDb.close();
}
public void insertWf(String name,String cls){ //metodo per inserire i dati
ContentValues cv=new ContentValues();
cv.put(WfMetaData.WF_NAME_KEY, name);
cv.put(WfMetaData.WF_CLASS_KEY, cls);
mDb.insert(WfMetaData.WF_TABLE, null, cv);
}
/*public void removeWf(String name,String cls){ //metodo per inserire i dati
ContentValues cv=new ContentValues();
cv.remove(WfMetaData.WF_NAME_KEY);
cv.remove(WfMetaData.WF_CLASS_KEY);
mDb.(WfMetaData.WF_TABLE, null, cv);
}*/
public Cursor fetchAllWfs(){ //metodo per fare la query di tutti i dati
return mDb.query(WfMetaData.WF_TABLE, new String[]{WfMetaData.WF_NAME_KEY, WfMetaData.WF_CLASS_KEY},null,null,null,null,null);
}
static class WfMetaData { // i metadati della tabella, accessibili ovunque
static final String WF_TABLE = "wfs";
static final String ID = "_id";
static final String WF_NAME_KEY = "name";
static final String WF_CLASS_KEY = "class";
}
private static final String WF_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS " //codice sql di creazione della tabella
+ WfMetaData.WF_TABLE + " ("
+ WfMetaData.ID+ " integer primary key autoincrement, "
+ WfMetaData.WF_NAME_KEY + " text not null, "
+ WfMetaData.WF_CLASS_KEY + " text not null);";
public Cursor fetchWfs(){ //metodo per fare la query di tutti i dati
return mDb.query(WfMetaData.WF_TABLE, null,null,null,null,null,null);
}
public void delete_byName(String n){
mDb.delete(WfMetaData.WF_TABLE, WfMetaData.WF_NAME_KEY + "='" +n + "'", null);
//mDb.delete(WfMetaData.WF_TABLE, WfMetaData.WF_NAME_KEY + "=?", new String[] { n });
CharSequence text = "Il Workflow "+ n +" è stato rimosso con successo!";
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(mContext, text, duration);
toast.show();
}
public void delete_byID(long rowId) {
mDb.delete(WfMetaData.WF_TABLE, WfMetaData.WF_NAME_KEY + "=" + rowId, null);
CharSequence text = "Il Workflow è stato rimosso con successo!";
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(mContext, text, duration);
toast.show();
}
private class DbHelper extends SQLiteOpenHelper { //classe che ci aiuta nella creazione del db
public DbHelper(Context context, String name, CursorFactory factory,int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase _db) { //solo quando il db viene creato, creiamo la tabella
_db.execSQL(WF_TABLE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) {
Log.w(DEBUG_TAG, "Upgrading database. Existing contents will be lost. ["
+ oldVersion + "]->[" + newVersion + "]");
_db.execSQL("DROP TABLE IF EXISTS " + WF_TABLE_CREATE);
onCreate(_db);
}
}
public boolean isEmpty(){
boolean isEmpty = true;
Cursor cursor = mDb.query(WfMetaData.WF_TABLE, new String[] { WfMetaData.WF_NAME_KEY }, null, null, null, null, null);
if (cursor != null && cursor.getCount() > 0)
{
isEmpty = false;
}
return isEmpty;
}
}
public class RemoveWorkflow2 extends Activity {
private EditText nameEditText;
private EditText classEditText;
//private EditText idEditText;
//private int mSpinnerWF;
Spinner spin;
WorkflowChoice wf = new WorkflowChoice();
MyDatabase mDB;
SimpleCursorAdapter adapter;
private long mRowId;
private int spinnerPos;
private String delString;
Cursor c;
//MyDatabase mDB = wf.getDb();
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.remove_wf2);
mDB = new MyDatabase(getApplicationContext());
mDB.open();
spin = (Spinner)findViewById(R.id.wf_spinner);
c = mDB.fetchWfs();
startManagingCursor(c);
// create an array to specify which fields we want to display
String[] from = new String[]{WfMetaData.WF_NAME_KEY};
// create an array of the display item we want to bind our data to
int[] to = new int[]{android.R.id.text1};
// create simple cursor adapter
adapter =
new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, c, from, to );
adapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item );
// get reference to our spinner
spin.setAdapter(adapter);
spin.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int pos, long id) {
Cursor c = (Cursor)(parent.getAdapter().getItem(pos));
delString = c.getString(c.getColumnIndex(mDB.);
//spinnerPos = pos;
//mRowId = id; // database row id
}
});
//fillSpinner(spin);
Button btn = (Button)findViewById(R.id.button11);
btn.setText("Rimuovi");
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mDB.delete_byID(mRowId);
mDB.delete_byName(delString);
c.requery();
}
});
}
private void fillSpinner(Spinner s){
Cursor c = mDB.fetchWfs();
startManagingCursor(c);
// create an array to specify which fields we want to display
String[] from = new String[]{WfMetaData.WF_NAME_KEY};
// create an array of the display item we want to bind our data to
int[] to = new int[]{android.R.id.text1};
// create simple cursor adapter
SimpleCursorAdapter adapter =
new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, c, from, to );
adapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item );
// get reference to our spinner
s.setAdapter(adapter);
}
}
我的方法有问题:
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int pos, long id) {
Cursor c = (Cursor)(parent.getAdapter().getItem(pos));
delString = c.getString(c.getColumnIndex(mDB.);
//spinnerPos = pos;
//mRowId = id; // database row id
}
如何设置 delString?我没有 YOUR_COLUMN_ID .. 我该如何解决?谢谢