SQLite
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> SQLite

Có thể xóa các mục nhập cơ sở dữ liệu từ các mục bằng nút không?

Câu trả lời thay thế

Sau đây là mã cho một ví dụ khá cơ bản, nhưng hoạt động. Tuy nhiên, nó đi xa hơn một chút bằng cách kết hợp ListView và cho phép xóa bằng cách Nhấp giữ một mục trong ListView .

Tuy nhiên, điều này không sử dụng các đoạn.

Có 3 đoạn mã, MainActivity (MainActivity.java ), Lớp con SQLiteOpenHelper CrimeDBHelper (CrimeDBHelper.java ) và bố cục cho MainActivity, activity_main.xml :-

activity_main.xml

Việc này thật thẳng thắn. Lưu ý rằng nó bao gồm một ListView ở phần cuối.

<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

Hầu hết đều tương tự, ngoại trừ phương thức bổ sung getCrimeList() , điều này trả về một Con trỏ chứa tất cả dữ liệu từ bảng tội phạm (được sử dụng để điề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();
        }

    }
}

Điều đầu tiên cần lưu ý là dòng long lastcrimeid; , điều này được khai báo ở cấp độ lớp nên rất có sẵn trong suốt ( vấn đề bạn gặp phải với long databaseID ).

Bạn cũng có thể nhận thấy SimpleCursorAdapter sca; điều này sẽ được sử dụng cho ListView ( về cơ bản nó đặt dữ liệu từ con trỏ trong ListView ).

Bạn nên làm quen với nhiều đoạn mã sau đây. Trong summray:-

  • super.onCreate được gọi.
  • Hoạt động được đặt để sử dụng bố cục activity_main.xml.
  • Khi bố cục đã được tải, id được liên kết với các chế độ xem sẽ nhận được.
  • Con trỏ có được để lấy các tội phạm hiện tại từ cơ sở dữ liệu (có thể không có, đây không phải là vấn đề).

  • nút nghe để thêm một tội ác được thêm vào. Lưu ý rằng điều này sử dụng _id được trả về của hàng đã thêm hai lần ( thực tế là 3 lần vì nó thay đổi văn bản các nút xóa cho phù hợp ).

    • lastcrimeid được đặt bằng sự trả về của addCrime() phương pháp.
    • mDltCrime.setTag(lastcrimeid); đặt thẻ của nút xóa thành _id của hàng đã thêm.

    • Cũng lưu ý rằng tồn tại hai dòng bổ sung là crimelist = dbhlpr.getCrimeList();sca.swapCursor(crimelist); .

      • Đầu tiên thay thế con trỏ bằng những gì hiện có trong cơ sở dữ liệu (nghĩa là bao gồm hàng đã được thêm vào), thứ hai yêu cầu ListView sử dụng con trỏ mới, vì vậy khiến ListView hiển thị những gì hiện có trong cơ sở dữ liệu ( điều này được sử dụng lại khi xóa một hàng).
    • trình nghe nút cho nút xóa sau đó được thêm vào. Điều này có thể hoạt động theo hai cách. lastcrimeid có thể được sử dụng hoặc thay thế nút của nút có thể được sử dụng khi cả hai đều giữ _id của hàng sẽ bị xóa. Mã có nhận xét trước đó, vì vậy phương pháp sau được sử dụng (tức là giá trị trong thẻ của nút được truy xuất).

      • Lưu ý rằng phương pháp thứ hai này có nhược điểm là giá trị có thể là null, điều này sẽ gây ra ngoại lệ con trỏ null, do đó if (view.getTag != null) .
    • Như trên để làm mới ListView .

    • Tiếp theo, SimpleCursorAdapter được thiết lập, nó có 5 tham số:-

      • bố cục sẽ được sử dụng (android.R.layout.simple_list_item_1) là một bố cục có sẵn.
      • dữ liệu được sử dụng ở dạng Con trỏ. GHI CHÚ! cột có tên _id PHẢI tồn tại ( thường là một ý tưởng hay để luôn sử dụng _id INTEGER PRIMARY KEY vì lý do này. ) Lưu ý rằng chúng tôi nhận được một con trỏ crimelist qua getCrimeList phương pháp.
      • (Các) cột trong con trỏ mà từ đó dữ liệu sẽ được truy xuất.
      • (Các) chế độ xem trong bố cục nơi dữ liệu đã truy xuất sẽ được đặt.
      • Một giá trị mà tôi không thể nhớ mục đích của nó. Tuy nhiên 0 là tốt để sử dụng. Việc không mã hóa thông số thứ 5 này có thể dẫn đến thông báo không được dùng nữa.
      • (Lưu ý rằng tôi thường sử dụng Bộ điều chỉnh con trỏ tùy chỉnh vì chúng linh hoạt hơn nhiều, vì vậy hiếm khi sử dụng Mẫu).
  • Sau đó, ListView được yêu cầu sử dụng Bộ điều hợp theo mCrimeList.setAdapter(sca); .

  • Sau đó, một onItemLongClickListener được thêm vào ListView, sẽ xóa tội phạm đã được nhấp vào từ lâu (dài l là _id giá trị, do đó là lý do tại sao CursorAdapter cần _id và do đó tại sao dbhlpr.deleteCrime(l); ).

    • Một lần nữa ListView được làm mới.
  • Cuối cùng, khi con trỏ được sử dụng trong khi hoạt động vẫn được sử dụng onDestory được sử dụng để đóng Con trỏ (Con trỏ phải luôn được đóng khi kết thúc bằng).

Đây là cách nó trông (không đẹp nhưng có chức năng), với ba Tội lỗi được thêm vào (Nút xóa sẽ xóa Tội ác của thế kỷ tội ác). Nhấp chuột lâu vào bất kỳ tội phạm nào được liệt kê sẽ xóa tội phạm đó. Nhấp vào thêm sẽ thêm một mục nhập khác cho Tội phạm thế kỷ trừ khi dữ liệu được thay đổi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Khi nào phương thức SQLiteOpenHelper onCreate được gọi?

  2. Làm cách nào tôi có thể làm mới / mở lại cơ sở dữ liệu SQLite sau khi khôi phục nó, khi sử dụng một singleton cho trình trợ giúp cơ sở dữ liệu

  3. Gói đã đăng 50 chúc rượu. Không hiển thị thêm

  4. Hiển thị dữ liệu từ cơ sở dữ liệu bằng cách sử dụng bộ điều hợp cơ sở và chế độ xem danh sách

  5. IntentService đang đóng băng giao diện người dùng ứng dụng của tôi