在一个按钮上实现两个方法
Implement two methods on one button
我有两种方法可以从 sqlite 添加和删除数据 table。这两种方法单独工作都很好。我想做的是在一个按钮上实现这两种方法。
如果数据存在于 table 中,请在按钮上单击,删除数据,否则添加数据(如果不存在)并更改图像按钮中的可绘制对象。我尝试了很多东西,但我不知道该怎么做。
这是我的代码
public boolean addBookmark(String id, String word, String definition) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COL_ID, id);
values.put(COL_WORD, word);
values.put(COL_DEFINITION, definition);
db.insert(TABLE_BOOKMARK, null, values);
return true;
}
public Integer deleteBookmark(String id){
SQLiteDatabase db = this.getWritableDatabase();
return db.delete(TABLE_BOOKMARK, "id = ?",new String[]{id});
}
我做了类似的事情,但它不起作用我在 logcat 中收到错误。
public boolean isBookmark(String id) {
SQLiteDatabase db = this.getWritableDatabase();
String Query = "Select * from " + TABLE_BOOKMARK + " where " + id + " = ?" ;
Cursor cursor = db.rawQuery(Query, null);
if(cursor.getCount() <= 0){
cursor.close();
return false;
}
cursor.close();
return true;
}
并在 onclick 中
public void onClick(View v) {
boolean isBookmark = mDBHelper.isBookmark(id);
if (isBookmark){
mDBHelper.deleteBookmark(id);
btnBookmark.setImageResource(R.drawable.ic_bookmark_border);
} else {
mDBHelper.addBookmark(id,word,definition);
btnBookmark.setImageResource(R.drawable.ic_bookmark_fill);
}
这是我的 logcat 错误
2019-02-22 19:36:53.391 28210-28210/com.elytelabs.testnav E/SQLiteDatabase: Error inserting definition=Create a new folder by going to New > Directory . In the dialog box that opens name the directory fragment or any name of your choice.
Create a new Fragment file inside the created directory and name it dictionary or any word of your choice.
id=7 word=rvvg
android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: bookmark.id (code 1555 SQLITE_CONSTRAINT_PRIMARYKEY)
at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:796)
at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1564)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1433)
at com.elytelabs.testnav.database.DatabaseHelper.addBookmark(DatabaseHelper.java:125)
at com.elytelabs.testnav.DetailActivity.onClick(DetailActivity.java:68)
at android.view.View.performClick(View.java:6597)
at android.view.View.performClickInternal(View.java:6574)
at android.view.View.access00(View.java:778)
at android.view.View$PerformClick.run(View.java:25885)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
您首先需要检查数据是否存在,然后您可以添加或删除数据。
比如使用这样的方法
public static boolean CheckIsDataAlreadyInDBorNot(String TableName,
String dbfield, String fieldValue) {
SQLiteDatabase sqldb = EGLifeStyleApplication.sqLiteDatabase;
String Query = "Select * from " + TableName + " where " + dbfield + " = " + fieldValue;
Cursor cursor = sqldb.rawQuery(Query, null);
if(cursor.getCount() <= 0){
cursor.close();
return false;
}
cursor.close();
return true;
}
取自
那么,你可以简单地做。
if( CheckIsDataAlreadyInDBorNot( ... ) ) {
deleteBookmark( ... );
} else {
addBookmark( ... );
}
我认为 isBookmark
中的以下代码行不正确:
String Query = "Select * from " + TABLE_BOOKMARK + " where " + id + " = ?" ;
我相信这会创建一个如下所示的 select 语句:
"Select * from TABLE where 5 = ?"
*当然我不知道你的 TABLE_BOOKMARK const 值实际上是什么所以我把 table 名称放在 TABLE 中。而且,我随意使用了5的id值。
声明应该像下面这样:
String Query = "Select * from " + TABLE_BOOKMARK + " where id = " + id;
这似乎也有道理,因为这意味着您的 isBookmark 永远不会删除您希望它删除的记录值(因为它永远不会成功找到与查询匹配的记录)。这意味着插入总是失败,因为记录实际上仍然存在。
我有两种方法可以从 sqlite 添加和删除数据 table。这两种方法单独工作都很好。我想做的是在一个按钮上实现这两种方法。 如果数据存在于 table 中,请在按钮上单击,删除数据,否则添加数据(如果不存在)并更改图像按钮中的可绘制对象。我尝试了很多东西,但我不知道该怎么做。
这是我的代码
public boolean addBookmark(String id, String word, String definition) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COL_ID, id);
values.put(COL_WORD, word);
values.put(COL_DEFINITION, definition);
db.insert(TABLE_BOOKMARK, null, values);
return true;
}
public Integer deleteBookmark(String id){
SQLiteDatabase db = this.getWritableDatabase();
return db.delete(TABLE_BOOKMARK, "id = ?",new String[]{id});
}
我做了类似的事情,但它不起作用我在 logcat 中收到错误。
public boolean isBookmark(String id) {
SQLiteDatabase db = this.getWritableDatabase();
String Query = "Select * from " + TABLE_BOOKMARK + " where " + id + " = ?" ;
Cursor cursor = db.rawQuery(Query, null);
if(cursor.getCount() <= 0){
cursor.close();
return false;
}
cursor.close();
return true;
}
并在 onclick 中
public void onClick(View v) {
boolean isBookmark = mDBHelper.isBookmark(id);
if (isBookmark){
mDBHelper.deleteBookmark(id);
btnBookmark.setImageResource(R.drawable.ic_bookmark_border);
} else {
mDBHelper.addBookmark(id,word,definition);
btnBookmark.setImageResource(R.drawable.ic_bookmark_fill);
}
这是我的 logcat 错误
2019-02-22 19:36:53.391 28210-28210/com.elytelabs.testnav E/SQLiteDatabase: Error inserting definition=Create a new folder by going to New > Directory . In the dialog box that opens name the directory fragment or any name of your choice.
Create a new Fragment file inside the created directory and name it dictionary or any word of your choice.
id=7 word=rvvg
android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: bookmark.id (code 1555 SQLITE_CONSTRAINT_PRIMARYKEY)
at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:796)
at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1564)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1433)
at com.elytelabs.testnav.database.DatabaseHelper.addBookmark(DatabaseHelper.java:125)
at com.elytelabs.testnav.DetailActivity.onClick(DetailActivity.java:68)
at android.view.View.performClick(View.java:6597)
at android.view.View.performClickInternal(View.java:6574)
at android.view.View.access00(View.java:778)
at android.view.View$PerformClick.run(View.java:25885)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
您首先需要检查数据是否存在,然后您可以添加或删除数据。
比如使用这样的方法
public static boolean CheckIsDataAlreadyInDBorNot(String TableName,
String dbfield, String fieldValue) {
SQLiteDatabase sqldb = EGLifeStyleApplication.sqLiteDatabase;
String Query = "Select * from " + TableName + " where " + dbfield + " = " + fieldValue;
Cursor cursor = sqldb.rawQuery(Query, null);
if(cursor.getCount() <= 0){
cursor.close();
return false;
}
cursor.close();
return true;
}
取自
那么,你可以简单地做。
if( CheckIsDataAlreadyInDBorNot( ... ) ) {
deleteBookmark( ... );
} else {
addBookmark( ... );
}
我认为 isBookmark
中的以下代码行不正确:
String Query = "Select * from " + TABLE_BOOKMARK + " where " + id + " = ?" ;
我相信这会创建一个如下所示的 select 语句:
"Select * from TABLE where 5 = ?"
*当然我不知道你的 TABLE_BOOKMARK const 值实际上是什么所以我把 table 名称放在 TABLE 中。而且,我随意使用了5的id值。
声明应该像下面这样:
String Query = "Select * from " + TABLE_BOOKMARK + " where id = " + id;
这似乎也有道理,因为这意味着您的 isBookmark 永远不会删除您希望它删除的记录值(因为它永远不会成功找到与查询匹配的记录)。这意味着插入总是失败,因为记录实际上仍然存在。