Alternativní odpověď
Následuje kód pro docela základní, ale fungující příklad. Jde však ještě o něco dále tím, že obsahuje ListView a povolení smazání dlouhým kliknutím na položku v ListView .
To však nepoužívá fragmenty.
Existují 3 kusy kódu, MainActivity (MainActivity.java
), podtřída SQLiteOpenHelper CrimeDBHelper (CrimeDBHelper.java
) a rozložení pro MainActivity, activity_main.xml
:-
activity_main.xml
To je docela přímočaré. Všimněte si, že obsahuje ListView na konci.
<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
Většina je podobná, kromě dodatečné metody getCrimeList()
, vrátí kurzor, který obsahuje všechna data z tabulky zločinů (používá se k naplnění 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();
}
}
}
První věc, kterou je třeba si všimnout, je řádek long lastcrimeid;
, toto je deklarováno na úrovni třídy, takže je velmi dostupné v celém (problém, který jste měli s long databaseID
).
Můžete si také všimnout SimpleCursorAdapter sca;
toto bude použito pro ListView
(v podstatě umístí data z kurzoru do ListView ).
Měli byste být obeznámeni s velkou částí následujícího kódu. Stručně řečeno:-
- volá se super.onCreate.
- Aktivita je nastavena tak, aby používala rozložení activity_main.xml.
- Po načtení rozvržení se získají ID přidružená k zobrazením.
-
Kurzor se získá získáním aktuálních zločinů z databáze (může být žádný, to není problém).
-
je přidán posluchač tlačítka pro přidání trestného činu. Všimněte si, že toto používá vrácené _id přidaného řádku dvakrát (ve skutečnosti 3krát, protože se odpovídajícím způsobem změní text tlačítek pro odstranění ).
lastcrimeid
je nastaven návratemaddCrime()
metoda.-
mDltCrime.setTag(lastcrimeid);
nastaví značku tlačítka pro odstranění na_id
přidaného řádku. -
Všimněte si také, že existují dva další řádky, jmenovitě
crimelist = dbhlpr.getCrimeList();
asca.swapCursor(crimelist);
.- První nahradí kurzor tím, co je nyní v databázi (tj. zahrnuje řádek, který byl přidán), druhý řekne ListView, aby použil nový kurzor, takže ListView zobrazí, co je nyní v databázi ( toto se znovu použije při mazání řádku).
-
poté se přidá posluchač tlačítka pro tlačítko mazání. To může fungovat dvěma způsoby.
lastcrimeid
lze použít nebo alternativně lze použít fázi tlačítka jako obě drží _id řádku, který má být smazán. Kód má první zakomentovaný, takže se použije druhý způsob (tj. načte se hodnota v tagu tlačítka).- Všimněte si, že tato druhá metoda má nevýhodu v tom, že hodnota může být null, což by způsobilo výjimku nulového ukazatele, proto
if (view.getTag != null)
.
- Všimněte si, že tato druhá metoda má nevýhodu v tom, že hodnota může být null, což by způsobilo výjimku nulového ukazatele, proto
-
Stejně jako výše pro obnovení ListView .
-
Dále je SimpleCursorAdapter nastaven, vyžaduje 5 parametrů:-
- Rozvržení, které má být použito (android.R.layout.simple_list_item_1), je standardní rozvržení.
- data, která mají být použita ve formě kurzoru. POZNÁMKA! sloupec s názvem _id MUSÍ existovat (obecně je dobré vždy použít
_id INTEGER PRIMARY KEY
z tohoto důvodu. ) Všimněte si, že dostáváme Cursorcrimelist
prostřednictvímgetCrimeList
metoda. - Sloupce v kurzoru, ze kterých se mají načíst data.
- Zobrazení v rozložení, kam budou umístěna načtená data.
- Hodnota, jejíž účel si nepamatuji. Nicméně 0 je vhodné použít. Nekódování tohoto 5. parametru pravděpodobně povede k zastaralé zprávě.
- (Všimněte si, že běžně používám Custom CursorAdapters, protože jsou mnohem flexibilnější, takže jen zřídka používám Simples).
-
Poté je ListView řečeno, aby použil adaptér podle
mCrimeList.setAdapter(sca);
. -
Poté
onItemLongClickListener
je přidán do ListView, který smaže zločin, na který bylo dlouho kliknuto (dlouhé l je _id hodnotu, tedy důvod, proč CursorAdapter potřebuje _id a protodbhlpr.deleteCrime(l);
).- Opět ListView je obnoveno.
-
Nakonec, když je kurzor používán, zatímco aktivita zůstává používána
onDestory
metoda se používá k uzavření kurzoru (kurzory by měly být vždy uzavřeny, když skončíte s).
Takhle to vypadá (ne hezké, ale funkční) se třemi přidanými zločiny (tlačítko smazat odstraní Zločin století zločin). Dlouhým kliknutím na jakýkoli zločin uvedený v seznamu tento zločin smažete. Kliknutím na přidat přidáte další položku pro Crime of the Century, pokud nebudou změněna data.