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 deaddCrime()
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();
etsca.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)
.
- 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
-
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 curseurcrimelist
viagetCrimeList
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 pourquoidbhlpr.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.