SQLite
 sql >> Base de données >  >> RDS >> SQLite

Les entrées de base de données ajoutées à partir d'éléments peuvent-elles être supprimées avec le bouton ?

Réponse alternative

Voici le code d'un exemple assez basique, mais fonctionnel. Cependant, il va un peu plus loin en incorporant un ListView et permettant la suppression par LongClicking un élément dans le ListView .

Cependant, cela n'utilise pas de fragments.

Il y a 3 morceaux de code, la MainActivity (MainActivity.java ), la sous-classe SQLiteOpenHelper CrimeDBHelper (CrimeDBHelper.java ) et la disposition de MainActivity, activity_main.xml :-

activity_main.xml

C'est assez simple. Notez qu'il inclut un ListView à la fin.

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

CrimeDBHelper.java

La plupart sont similaires, à l'exception de la méthode supplémentaire getCrimeList() , cela renvoie un Cursor qui contient toutes les données de la table des crimes (utilisée pour remplir la 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);
    }
}

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

    }
}

La première chose à noter est la ligne long lastcrimeid; , ceci est déclaré au niveau de la classe et est donc très disponible partout (le problème que vous rencontriez avec long databaseID ).

Vous pourriez également remarquer SimpleCursorAdapter sca; ceci sera utilisé pour le ListView (essentiellement, il place les données du curseur dans le ListView ).

Vous devriez être familiarisé avec une grande partie du code suivant. En résumé :-

  • super.onCreate est appelé.
  • L'activité est configurée pour utiliser la mise en page activity_main.xml.
  • Lorsque la mise en page a été chargée, les identifiants associés aux vues sont obtenus.
  • Un curseur est obtenu en obtenant les crimes actuels de la base de données (peut-être aucun, ce n'est pas un problème).

  • le bouton d'écoute pour ajouter un crime est ajouté. Notez que cela utilise le _id renvoyé de la ligne ajoutée deux fois (en fait 3 fois car cela modifie le texte des boutons de suppression en conséquence ).

    • lastcrimeid est défini par le retour de addCrime() méthode.
    • mDltCrime.setTag(lastcrimeid); définit la balise du bouton de suppression sur _id de la ligne ajoutée.

    • Notez également que deux lignes supplémentaires existent à savoir crimelist = dbhlpr.getCrimeList(); et sca.swapCursor(crimelist); .

      • Le premier remplace le curseur par ce qui est maintenant dans la base de données (c'est-à-dire inclut la ligne qui a été ajoutée), le second indique à ListView d'utiliser le nouveau curseur, ce qui fait que ListView affiche ce qui est maintenant dans la base de données ( ceci est réutilisé lors de la suppression d'une ligne).
    • l'écouteur de bouton pour le bouton de suppression est alors ajouté. Cela peut fonctionner de deux manières. Le lastcrimeid peut être utilisé ou alternativement le tage du bouton peut être utilisé car les deux contiennent le _id de la ligne à supprimer. Le code a la première méthode commentée, donc la dernière méthode est utilisée (c'est-à-dire que la valeur dans la balise du bouton est récupérée).

      • Notez que cette dernière méthode présente l'inconvénient que la valeur peut être nulle, ce qui entraînerait une exception de pointeur nul, d'où le if (view.getTag != null) .
    • Comme ci-dessus pour actualiser la ListView .

    • Ensuite, le SimpleCursorAdapter est configuré, il prend 5 paramètres :-

      • la mise en page à utiliser (android.R.layout.simple_list_item_1) est une mise en page standard.
      • les données à utiliser sous la forme d'un curseur. REMARQUE! une colonne nommée _id DOIT exister (généralement une bonne idée de toujours utiliser _id INTEGER PRIMARY KEY pour cette raison. ) Notez que nous obtenons un curseur crimelist via getCrimeList méthode.
      • La ou les colonnes du curseur à partir desquelles les données doivent être récupérées.
      • La ou les vues de la mise en page où les données récupérées seront placées.
      • Une valeur dont je ne me souviens pas du but. Cependant 0 est bien à utiliser. Ne pas coder ce 5ème paramètre entraînera probablement un message obsolète.
      • (Notez que j'utilise normalement des CursorAdapters personnalisés car ils sont beaucoup plus flexibles, donc j'utilise rarement des Simples).
  • Ensuite, le ListView est invité à utiliser l'adaptateur selon mCrimeList.setAdapter(sca); .

  • Puis un onItemLongClickListener est ajouté à ListView, ce qui supprimera le crime qui a été cliqué longtemps (long l est le _id valeur, d'où une raison pour laquelle un CursorAdapter a besoin de _id et donc pourquoi dbhlpr.deleteCrime(l); ).

    • Encore la ListView est actualisé.
  • Enfin, comme le curseur est utilisé alors que l'activité reste en cours d'utilisation onDestory est utilisée pour fermer le curseur (les curseurs doivent toujours être fermés lorsque vous avez terminé avec).

Voici à quoi ça ressemble (pas joli mais fonctionnel), avec trois Crimes ajoutés (Le bouton de suppression supprimerait le Le Crime du Siècle la criminalité). Un clic long sur n'importe quel crime répertorié supprimera ce crime. Cliquer sur ajouter ajouterait une autre entrée pour Crime du siècle à moins que les données ne soient modifiées.