gpt4 book ai didi

java - 是否可以通过按钮删除从项目添加的数据库条目?

转载 作者:太空狗 更新时间:2023-10-29 13:07:39 24 4
gpt4 key购买 nike

我正在尝试使用“Android编程:大书呆子牧场指南”自学android开发,其中的一项练习(如果您熟悉这本书,请参阅第14章)涉及创建一个工具栏,其中的一项向该项目添加新条目单击该项目时的数据库。一个挑战性的问题是删除条目,但是我想从WITHIN条目中删除条目。对不起,如果我没有做好解释。

基本上是首次打开该应用程序时,右上角的工具栏上有两个项目,几乎是空的。 Here is a screenshot if it helps。这两个项目相加或计数的条目数,然后将其显示在列表上。在上图中,只有一个条目。单击+符号时,将添加一个新条目,它将带您到layout条目中,以便您添加所有详细信息。我想添加一个删除按钮,使您可以在查看详细信息时删除条目。

这是我尝试但无法使用的代码:
在CrimeLab.java中

public void addCrime(Crime c){
ContentValues values = getContentValues(c);

mDatabase.insert(CrimeTable.NAME, null, values);
}

public void deleteCrime(Crime crimeId){

String uuidString = crimeId.toString();
mDatabase.delete(CrimeTable.NAME, null, new String[]
{uuidString});
}

我基本上试图撤消创建数据库条目时的操作。
在CrimeListFragment.java中:
@Override
public boolean onOptionsItemSelected(MenuItem item){
switch (item.getItemId()){
case R.id.menu_item_new_crime:
Crime crime = new Crime();
CrimeLab.get(getActivity()).addCrime(crime);
Intent intent =
CrimePagerActivity.newIntent(getActivity(), crime.getId());
startActivity(intent);
return true;
case R.id.menu_item_show_subtitle:
mSubtitleVisible = !mSubtitleVisible;
getActivity().invalidateOptionsMenu();
updateSubtitle();
return true;
case R.id.delete_button:
Crime mCrime = new Crime();
CrimeLab.get(getActivity()).deleteCrime(mCrime);
default:
return super.onOptionsItemSelected(item);
}
}

我想我需要创建一个onClick动作,但是如果我试图从由条目中的项目创建的数据库中删除条目,该怎么办?

我想添加的其他内容是通过滑动以显示删除按钮来从原始页面删除条目,例如在Messenger应用中。

抱歉,如果我没有正确提出问题。对我来说,这是一个全新的世界,与书一起阅读是很有帮助的,但是我发现它很容易使您认为您理解了某些内容,然后完全迷失了自己。
另外,我检查了stackoverflow和其他各种论坛,但没有找到这个问题的确切答案。

根据请求,这是Crime.java的代码:
public class Crime {
private String mTitle;
private Date mDate;
private boolean mSolved;
private String mSuspect;

public Date getDate() {
return mDate;
}

private UUID mId;

public void setDate(Date date) {
mDate = date;
}

public void setSolved(boolean solved) {
mSolved = solved;
}

public String getSuspect(){
return mSuspect;
}

public void setSuspect (String suspect){
mSuspect = suspect;
}

public String getPhotoFilename(){
return "IMG_" + getId().toString() + ".jpg";
}

public boolean isSolved() {

return mSolved;
}



public Crime(){
//generate unique identifier
this(UUID.randomUUID());
}

public Crime(UUID id){
mId = id;
mDate = new Date();
}

public UUID getId() {
return mId;
}

public String getTitle() {
return mTitle;
}

public void setTitle(String title) {
mTitle = title;
}
}

这是控制我的数据库条目的.java类:
public class CrimeBaseHelper extends SQLiteOpenHelper{
private static final int VERSION = 1;
private static final String DATABASE_NAME = "crimeBase.db";

public CrimeBaseHelper(Context context){
super(context, DATABASE_NAME, null, VERSION);
}

@Override
public void onCreate(SQLiteDatabase db){
db.execSQL("create table " + CrimeTable.NAME + "(" +
" _id integer primary key autoincrement, " +
CrimeTable.Cols.UUID + ", " +
CrimeTable.Cols.TITLE + ", " +
CrimeTable.Cols.DATE + ", " +
CrimeTable.Cols.SOLVED + ", " +
CrimeTable.Cols.SUSPECT +
")"
);

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){

}
}

这是我搞砸.onClickListener的地方
mDeleteButton = (Button)v.findViewById(R.id.delete_button);
mDeleteButton.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
Crime mCrime = new crime();
mCrime.getId()
CrimeLab.get(getActivity()).deleteCrime(mCrime);
}
}
);

最佳答案

替代答案

以下是一个非常基本但有效的示例的代码。但是,通过合并 ListView 并允许通过长按 ListView 中的项目来允许删除,它可以走得更远。

但是,这不使用片段。

有3段代码, MainActivity (MainActivity.java),SQLiteOpenHelper子类 CrimeDBHelper (CrimeDBHelper.java)和MainActivity的布局,activity_main.xml:-

activity_main.xml

这很简单。请注意,它的末尾包括一个 ListView

<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

除附加方法 getCrimeList() 之外,大多数方法都相似,这将返回一个Cursor,其中包含criminions表中的所有数据(用于填充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();
}

}
}

首先要注意的是 long lastcrimeid;行,它是在类级别声明的,因此在整个过程中都是可用的(您在 上遇到的问题long databaseID )。

您可能还会注意到 SimpleCursorAdapter sca; ,它将用于 ListView (基本上将光标中的数据放置在ListView中)。

您应该熟悉以下许多代码。总而言之:
  • super.onCreate被调用。
  • 该 Activity 被设置为使用activity_main.xml布局。
  • 由于已加载布局,因此获得了与视图关联的ID。
  • 获得了一个Cursor,可以从数据库中获取当前的犯罪(可能不是,这不是问题)。
  • 添加了用于添加犯罪的按钮侦听器。请注意,这将使用添加的行返回的 _id 两次(实际上是3次,因为它相应地更改了删除按钮的文本)。
  • lastcrimeid addCrime()方法的返回设置。
  • mDltCrime.setTag(lastcrimeid);将删除按钮的标签设置为添加行的 _id
  • 还请注意,存在另外两行,即crimelist = dbhlpr.getCrimeList();sca.swapCursor(crimelist);
  • 第一个将光标替换为数据库中现在的内容(即包括已添加的行),第二个告诉ListView使用新的光标,因此使ListView显示数据库中的当前内容(这是删除行时再次使用)。
  • 然后添加删除按钮的按钮侦听器。这可以通过两种方式进行。可以使用 lastcrimeid ,也可以使用按钮的有效期,因为它们都保留了要删除的行的 _id 。该代码已注释掉前者,因此使用后一种方法(即检索按钮标签中的值)。
  • 注意,后一种方法的缺点是该值可以为null,这将导致null指针异常,因此为if (view.getTag != null)
  • 如上所述,用于刷新 ListView
  • 接下来,设置SimpleCursorAdapter,它需要5个参数:-
  • 要使用的布局(android.R.layout.simple_list_item_1)是库存布局。
  • 以游标形式使用的数据。注意!必须存在一个名为 _id 的列(通常,出于这个原因,始终使用_id INTEGER PRIMARY KEY是一个好主意。)请注意,我们通过crimelist方法获得了一个Cursor getCrimeList
  • 游标中要从中检索数据的列。
  • 布局中将放置检索到的数据的视图。
  • 一个我不记得其目的的值。但是0可以使用。不对此第5个参数进行编码可能会导致不推荐使用的消息。
  • (请注意,我通常使用Custom CursorAdapters,因为它们更加灵活,因此很少使用Simples)。
  • 然后告诉ListView按照mCrimeList.setAdapter(sca);使用适配器。
  • 然后将onItemLongClickListener添加到ListView,这将删除长按的罪行(long l是 _id 值,因此是CursorAdapter需要 _id 的原因,因此也是dbhlpr.deleteCrime(l);的原因)。
  • 再次刷新 ListView
  • 最后,由于在 Activity 保持使用状态时使用了光标,因此onDestory方法用于关闭游标(完成后应始终关闭游标)。

  • 这就是它的外观(虽然不漂亮,但很实用),添加了三个Crimes(删除按钮将删除The Century of Century犯罪)。长按任何列出的犯罪将删除该犯罪。单击添加将为“世纪犯罪”添加另一个条目,除非数据已更改。

    enter image description here

    关于java - 是否可以通过按钮删除从项目添加的数据库条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45722118/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com