SQLite
 sql >> Teknologi Basis Data >  >> RDS >> SQLite

Bisakah entri basis data yang ditambahkan dari item dihapus dengan tombol?

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 kembalinya addCrime() 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(); dan sca.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) .
    • 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 Kursor crimelist melalui getCrimeList 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 mengapa dbhlpr.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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Memesan berdasarkan Nama Bulan di SQLite

  2. Bagaimana Fungsi Strftime() Bekerja di SQLite

  3. SQLite SEPERTI

  4. SQLite tidak ada kolom seperti itu

  5. Dapatkan Tanggal/Waktu dari Stempel Waktu Unix di SQLite