Jawaban Alternatif
Berikut ini adalah kode untuk contoh yang cukup mendasar, tetapi berfungsi. Namun, ini melangkah lebih jauh dengan memasukkan ListView dan mengizinkan penghapusan dengan LongClicking item di ListView .
Namun, ini tidak menggunakan fragmen.
Ada 3 buah kode yaitu MainActivity (MainActivity.java
), Subkelas SQLiteOpenHelper CrimeDBHelper (CrimeDBHelper.java
) dan tata letak untuk MainActivity, activity_main.xml
:-
aktivitas_main.xml
Ini cukup lurus ke depan. Perhatikan bahwa ini menyertakan ListView di akhir.
<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
Sebagian besar serupa, kecuali metode tambahan getCrimeList()
, ini mengembalikan Kursor yang berisi semua data dari tabel kejahatan (digunakan untuk mengisi 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();
}
}
}
Hal pertama yang harus diperhatikan adalah baris long lastcrimeid;
, ini dideklarasikan di tingkat kelas sehingga sangat banyak tersedia di seluruh (masalah yang Anda alami dengan long databaseID
).
Anda mungkin juga melihat SimpleCursorAdapter sca;
ini akan digunakan untuk ListView
(pada dasarnya ini menempatkan data dari kursor di ListView ).
Anda harus terbiasa dengan banyak kode berikut. Singkatnya:-
- super.onCreate dipanggil.
- Aktivitas disetel untuk menggunakan tata letak activity_main.xml.
- Saat tata letak telah dimuat, id yang terkait dengan tampilan diperoleh.
-
Kursor diperoleh dengan mendapatkan kejahatan saat ini dari database (mungkin tidak ada, ini bukan masalah).
-
pendengar tombol untuk menambahkan kejahatan ditambahkan. Perhatikan bahwa ini menggunakan _id . yang dikembalikan dari baris yang ditambahkan dua kali (sebenarnya 3 kali karena mengubah teks tombol hapus yang sesuai ).
lastcrimeid
diatur oleh kembalinyaaddCrime()
metode.-
mDltCrime.setTag(lastcrimeid);
menyetel tag tombol hapus ke_id
dari baris yang ditambahkan. -
Perhatikan juga bahwa ada dua baris tambahan yaitu
crimelist = dbhlpr.getCrimeList();
dansca.swapCursor(crimelist);
.- Yang pertama menggantikan kursor dengan apa yang sekarang ada di database (yaitu termasuk baris yang telah ditambahkan), yang kedua memberi tahu ListView untuk menggunakan kursor baru, sehingga menyebabkan ListView menampilkan apa yang sekarang ada di database ( ini digunakan lagi saat menghapus baris).
-
pendengar tombol untuk tombol hapus kemudian ditambahkan. Ini dapat bekerja dengan dua cara.
lastcrimeid
dapat digunakan atau secara bergantian tag tombol dapat digunakan karena keduanya menahan _id dari baris yang akan dihapus. Kode memiliki yang pertama dikomentari, jadi metode yang terakhir digunakan (yaitu nilai dalam tag tombol diambil).- Perhatikan metode yang terakhir ini memiliki kelemahan yaitu nilainya bisa nol, yang akan menyebabkan pengecualian penunjuk nol, oleh karena itu
if (view.getTag != null)
.
- Perhatikan metode yang terakhir ini memiliki kelemahan yaitu nilainya bisa nol, yang akan menyebabkan pengecualian penunjuk nol, oleh karena itu
-
Seperti di atas untuk menyegarkan ListView .
-
Selanjutnya SimpleCursorAdapter di setup, dibutuhkan 5 parameter :-
- tata letak yang akan digunakan (android.R.layout.simple_list_item_1) adalah tata letak stok.
- data yang akan digunakan berupa Kursor. CATATAN! kolom bernama _id HARUS ada (umumnya ide yang baik untuk selalu menggunakan
_id INTEGER PRIMARY KEY
untuk alasan ini. ) Perhatikan bahwa kita mendapatkan Kursorcrimelist
melaluigetCrimeList
metode. - Kolom di kursor tempat data akan diambil.
- Tampilan dalam tata letak tempat data yang diambil akan ditempatkan.
- Nilai yang tidak bisa kuingat tujuannya. Namun 0 baik-baik saja untuk digunakan. Tidak mengkodekan parameter ke-5 ini kemungkinan akan menghasilkan pesan yang tidak digunakan lagi.
- (Perhatikan saya biasanya menggunakan Custom CursorAdapters karena lebih fleksibel, jadi jarang menggunakan Simples).
-
Kemudian ListView diperintahkan untuk menggunakan Adaptor sesuai
mCrimeList.setAdapter(sca);
. -
Kemudian
onItemLongClickListener
ditambahkan ke ListView, yang akan menghapus kejahatan yang telah lama diklik (panjang l adalah _id nilai, maka alasan mengapa CursorAdapter membutuhkan _id dan karenanya mengapadbhlpr.deleteCrime(l);
).- Lagi ListView disegarkan.
-
Terakhir, karena kursor digunakan saat aktivitas tetap digunakan
onDestory
metode yang digunakan untuk menutup Kursor (Kursor harus selalu ditutup ketika selesai dengan).
Beginilah tampilannya (tidak cantik tapi fungsional), dengan tiga Kejahatan ditambahkan (Tombol hapus akan menghapus Kejahatan Abad Ini kejahatan). Mengklik lama kejahatan apa pun yang terdaftar akan menghapus kejahatan itu. Mengklik tambah akan menambahkan entri lain untuk Kejahatan Abad Ini kecuali jika datanya diubah.