1

データベースSQLiteからデータリストを表示するスピナーがあります。選択してボタン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からの削除方法が見つかりません。これはdbメソッドですか?

アプリを次のように変更しました。

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 exception) で次のエラーが発生します。

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

ところで、アプリを終了するまで DB を開いたままにしておく必要があります。

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

削除の 2 番目の方法 (名前による):

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 に答える