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ủaaddCrime()
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();
và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)
.
- 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 đó
-
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
quagetCrimeList
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 saodbhlpr.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.