1

我有一个微调器,它显示来自数据库 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 .. 我该如何解决?谢谢

4

1 回答 1

0

我假设按钮在微调器之外......

你真的不需要这个职位。设置类变量:

private int spinnerPos;     
private long mRowId;

为你的微调器添加这个:

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

然后为您的按钮:

btn.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {

        // Your code to get the string from the adapter
        mDB.delete_byName(yourString);
        c.requery();
});

顺便说一句,您应该让您的数据库保持打开状态,直到您退出应用程序。

我看到你问一个关于按 id 删除的问题。在您的数据库类中,您将拥有如下内容:

public boolean delete(long rowId) {
    return mDb.delete(TABLE_NAME, TABLE_ROWID + "=" + rowId, null) > 0;
}

希望这可以帮助!

编辑

更好的方法:

Private String delString;

为你的 spinnerListener 添加这个

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(YourDB.YOUR_COLUMN_ID));       }
});

按钮:

btn.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        mDB.delete_byName(delString);
        c.requery();
});

编辑 2

第一种删除方法(按 RowId):

public boolean delete_byID(long rowId) {
    return mDb.delete(WfMetaData.WF_TABLE, WfMetaData.ID + "=" + rowId, null) > 0;
}

第二种删除方法(按名称):

public boolean delete_byName(String name) {
    return mDb.delete(WfMetaData.WF_TABLE, WfMetaData.WF_NAME_KEY + "= '" + name + "'", null) > 0;
}
于 2012-05-10T13:17:49.847 回答