sql >> Base de Datos >  >> RDS >> SQLite

¿Se pueden eliminar las entradas de la base de datos agregadas desde los elementos con el botón?

Respuesta alternativa

El siguiente es el código de un ejemplo bastante básico, pero funcional. Sin embargo, va un poco más allá al incorporar un ListView y permitir la eliminación mediante LongClicking en un elemento en ListView .

Sin embargo, esto no usa fragmentos.

Hay 3 piezas de código, la MainActivity (MainActivity.java ), la subclase SQLiteOpenHelper CrimeDBHelper (CrimeDBHelper.java ) y el diseño de MainActivity, activity_main.xml :-

actividad_principal.xml

Esto es bastante sencillo. Tenga en cuenta que incluye un ListView al final.

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="The Crime Thing"
    android:layout_gravity="center"
    android:textStyle="bold"/>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <TextView
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:text="Crime Title"
        />
    <EditText
        android:id="@+id/crimetitle"
        android:layout_width="0dp"
        android:layout_weight="3"
        android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <TextView
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:text="Crime Date"
        />
    <EditText
        android:id="@+id/crimedate"
        android:layout_width="0dp"
        android:layout_weight="3"
        android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <TextView
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:text="Suspect"
        />
    <EditText
        android:id="@+id/crimesuspect"
        android:layout_width="0dp"
        android:layout_weight="3"
        android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <TextView
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:text="Crime Solved?"
        />
    <CheckBox
        android:id="@+id/crimesolved"
        android:layout_width="0dp"
        android:layout_weight="3"
        android:layout_height="wrap_content" />
</LinearLayout>
<Button
    android:id="@+id/addcrime"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="ADD CRIME"/>
<Button
    android:id="@+id/dltcrime"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="DLT CRIME (ID=?)"/>
<ListView
    android:id="@+id/crimelist"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
</ListView>

CrimenDBHelper.java

La mayoría es similar, excepto el método adicional getCrimeList() , esto devuelve un Cursor que contiene todos los datos de la tabla de delitos (utilizada para completar ListView).

public class CrimeDBHelper extends SQLiteOpenHelper {

    public static final String DBNAME = "crimesdb";
    public static final int DBVERSION = 1;
    public static final String CRIMESTABLE = "crimes";
    public static final String CRIMEID_COL = "_id";
    public static final String CRIMETITLE_COL = "crimetitle";
    public static final String CRIMEDATE_COL = "crimedate";
    public static final String CRIMESUSPECT_COL = "crimesuspect";
    public static final String CRIMESOLVED_COL = "crimesolved";


    public static final String TABLECRTSQL =
            "CREATE TABLE " + CRIMESTABLE + "(" +
                    CRIMEID_COL + " INTEGER PRIMARY KEY," +
                    CRIMETITLE_COL + " TEXT," +
                    CRIMEDATE_COL + " TEXT, " +
                    CRIMESUSPECT_COL + " TEXT, " +
                    CRIMESOLVED_COL + " INTEGER" +
                    ");";

    public CrimeDBHelper(Context context) {
        super(context, DBNAME, null, DBVERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(TABLECRTSQL);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) {
    }

    public long addCrime(String crimetitle, String crimedate, String crimesuspect, int crimesolved) {

        SQLiteDatabase db = getWritableDatabase();

        ContentValues cv = new ContentValues();
        cv.put(CRIMETITLE_COL,crimetitle);
        cv.put(CRIMEDATE_COL,crimedate);
        cv.put(CRIMESUSPECT_COL,crimesuspect);
        cv.put(CRIMESOLVED_COL,crimesolved);
        return db.insert(CRIMESTABLE,null,cv);
    }

    public int deleteCrime(long crimeid) {
        SQLiteDatabase db = getWritableDatabase();
        String whereclause = CRIMEID_COL + "=?";
        String[] whereargs = {Long.toString(crimeid)};
        return db.delete(CRIMESTABLE,whereclause,whereargs);
    }

    public Cursor getCrimeList() {
        SQLiteDatabase db = getWritableDatabase();
        return db.query(CRIMESTABLE,null,null,null,null,null,null,null);
    }
}

Actividad Principal.java

public class MainActivity extends AppCompatActivity {

    EditText mCrimeTitle;
    EditText mCrimeDate;
    EditText mCrimeSuspect;
    CheckBox mCrimeSolved;

    Button mAddCrime;
    Button mDltCrime;
    ListView mCrimeList;

    CrimeDBHelper dbhlpr = new CrimeDBHelper(this);
    Cursor crimelist;
    SimpleCursorAdapter sca;

    long lastcrimeid;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mCrimeTitle = (EditText) findViewById(R.id.crimetitle);
        mCrimeDate = (EditText) findViewById(R.id.crimedate);
        mCrimeSuspect = (EditText) findViewById(R.id.crimesuspect);
        mCrimeSolved = (CheckBox) findViewById(R.id.crimesolved);
        mCrimeList = (ListView) findViewById(R.id.crimelist);
        mAddCrime = (Button) findViewById(R.id.addcrime);
        mDltCrime = (Button) findViewById(R.id.dltcrime);

        crimelist = dbhlpr.getCrimeList();

        // Setup Button to Add a crime
        mAddCrime.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int solved = 0;
                if (mCrimeSolved.isChecked()) {
                    solved = 1;
                }
                lastcrimeid =  dbhlpr.addCrime(
                        mCrimeTitle.getText().toString(),
                        mCrimeDate.getText().toString(),
                        mCrimeSuspect.getText().toString(),
                        solved
                );
                mDltCrime.setText("DLT CRIME (ID=" + Long.toString(lastcrimeid) + ")");
                mDltCrime.setTag(lastcrimeid);
                crimelist = dbhlpr.getCrimeList();
                sca.swapCursor(crimelist);
            }
        });

        // Setup button to delete the latest Crime added
        mDltCrime.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //dbhlpr.deleteCrime(lastcrimeid); can do it this way
                if (view.getTag() != null) {
                    dbhlpr.deleteCrime((long)view.getTag());
                    crimelist = dbhlpr.getCrimeList();
                    sca.swapCursor(crimelist);
                }
            }
        });

        sca = new SimpleCursorAdapter(this,
                android.R.layout.simple_list_item_1,
                crimelist,
                new String[]{CrimeDBHelper.CRIMETITLE_COL},
                new int[]{android.R.id.text1},
                0
        );
        mCrimeList.setAdapter(sca);

        mCrimeList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
                dbhlpr.deleteCrime(l);
                crimelist = dbhlpr.getCrimeList();
                sca.swapCursor(crimelist);
                return true;
            }
        });

    }

    protected void onDestroy() {
        super.onDestroy();
        if (crimelist != null) {
            crimelist.close();
        }

    }
}

Lo primero a tener en cuenta es la línea long lastcrimeid; , esto se declara a nivel de clase, por lo que está disponible en todo momento (el problema que tenía con long databaseID ).

También puede notar SimpleCursorAdapter sca; esto se usará para ListView (básicamente coloca los datos del cursor en ListView ).

Debe estar familiarizado con gran parte del siguiente código. En resumen:-

  • se llama super.onCreate.
  • La actividad está configurada para usar el diseño activity_main.xml.
  • A medida que se ha cargado el diseño, se obtienen los id asociados con las vistas.
  • Se obtiene un Cursor obteniendo los delitos actuales de la base de datos (puede que no haya ninguno, esto no es un problema).

  • Se agrega el botón de escucha para agregar un crimen. Tenga en cuenta que esto utiliza el _id devuelto de la fila agregada dos veces (en realidad 3 veces, ya que cambia el texto de los botones de eliminación en consecuencia ).

    • lastcrimeid se establece por el retorno de addCrime() método.
    • mDltCrime.setTag(lastcrimeid); establece la etiqueta del botón Eliminar en _id de la fila añadida.

    • También tenga en cuenta que existen dos líneas adicionales, a saber, crimelist = dbhlpr.getCrimeList(); y sca.swapCursor(crimelist); .

      • El primero reemplaza el cursor con lo que ahora está en la base de datos (es decir, incluye la fila que se agregó), el segundo le dice a ListView que use el nuevo cursor, por lo que hace que ListView muestre lo que ahora está en la base de datos ( esto se usa nuevamente al eliminar una fila).
    • luego se agrega el botón de escucha para el botón de eliminar. Esto puede funcionar de dos maneras. El lastcrimeid se puede usar o, alternativamente, se puede usar la etiqueta del botón, ya que ambos tienen el _id de la fila a eliminar. El código tiene el primero comentado, por lo que se usa el último método (es decir, se recupera el valor en la etiqueta del botón).

      • Tenga en cuenta que este último método tiene la desventaja de que el valor puede ser nulo, lo que provocaría una excepción de puntero nulo, de ahí el if (view.getTag != null) .
    • Como arriba para actualizar el ListView .

    • A continuación, se configura SimpleCursorAdapter, toma 5 parámetros:-

      • el diseño que se utilizará (android.R.layout.simple_list_item_1) es un diseño estándar.
      • los datos que se utilizarán en forma de Cursor. ¡NOTA! una columna llamada _id DEBE existir (generalmente es una buena idea usar siempre _id INTEGER PRIMARY KEY por este motivo. ) Tenga en cuenta que obtenemos un Cursor crimelist a través de getCrimeList método.
      • La(s) columna(s) en el cursor desde donde se recuperarán los datos.
      • La(s) vista(s) en el diseño donde se colocarán los datos recuperados.
      • Un valor cuyo propósito no recuerdo. Sin embargo, 0 está bien para usar. No codificar este quinto parámetro probablemente resultará en un mensaje obsoleto.
      • (Tenga en cuenta que normalmente uso Custom CursorAdapters ya que son mucho más flexibles, por lo que rara vez uso Simples).
  • Luego, se le dice a ListView que use el adaptador según mCrimeList.setAdapter(sca); .

  • Luego un onItemLongClickListener se agrega a ListView, lo que eliminará el delito en el que se hizo clic durante mucho tiempo (long l es el _id valor, por lo tanto, una razón por la que un CursorAdapter necesita _id y de ahí por qué dbhlpr.deleteCrime(l); ).

    • Otra vez ListView se actualiza.
  • Finalmente, como se usa el cursor mientras la actividad permanece en uso onDestory El método se utiliza para cerrar el cursor (los cursores siempre deben cerrarse cuando se termina).

Así es como se ve (no bonito pero funcional), con tres Crímenes agregados (El botón de eliminar eliminaría el El Crímen del Siglo delito). Al hacer clic largo en cualquier delito enumerado, se eliminará ese delito. Al hacer clic en agregar, se agregaría otra entrada para Crime of the Century a menos que se cambiaran los datos.