我有一个名称和一个数字(债务)表 我想要做的是当用户输入一个新的数字到一个现有的名字,数字被添加到初始号,如果 它首先检查名称存在,如果它不那么它INSERT
一个新行 - 这工作 -
如果名称不存在,它应该UPDATE
现有债务如上解释 - 它不工作,更新是我需要的帮助试图添加到SQLite数据库中的现有值
现在我得到一个SQLiteException
,从我的理解是WHERE
在更新不好,尝试了几种方法来解决这个BU牛逼没有工作,仍然得到例外
这是相关代码: 首先从DatabaseHelper
类中的方法是异常点也作为主要的问题:
public boolean updateExistingFriend(String name, String debt, String date) {
String where = KEY_NAME + "=" + name;
ContentValues newValues = new ContentValues();
newValues.put(KEY_NAME, name);
newValues.put(KEY_DEBT, debt);
newValues.put(KEY_DATE, date);
return db.update(DATABASE_TABLE, newValues, where, null) != 0;
}
这是在主要活动的方法:
private void updateExistingDebt(String name){
Calendar c = Calendar.getInstance();
SimpleDateFormat df = new SimpleDateFormat("dd-MMM-yy");
String mydate = df.format(c.getTime());
String whosDebt;
Cursor curs = myDb.getByName(name);
String addedDebt = curs.getString(curs.getColumnIndex("debt"));
if (checkFriendDebt.isChecked()) {
whosDebt = "+" + debtAmount.getText().toString()+ addedDebt +currency.getSelectedItem().toString();
}else{
whosDebt = "-" + debtAmount.getText().toString()+ addedDebt +currency.getSelectedItem().toString();
}
Cursor cursor = myDb.getExistingDebtName(name);
if (cursor.moveToFirst()){
String frName = friendName.getText().toString();
myDb.updateExistingFriend(frName, whosDebt, mydate);
myDb.insertHistory(frName, whosDebt, mydate, debtLabel.getText().toString());
}
cursor.close();
populateListView();
totalDebts();
}
例外的logcat:
10-07 05:24:50.890 26063-26063/? E/AndroidRuntime: android.database.sqlite.SQLiteException: no such column: Tal (code 1): , while compiling: UPDATE maindebt SET date=?,name=?,debt=? WHERE name=Tal
10-07 05:24:50.890 26063-26063/? E/AndroidRuntime: at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
10-07 05:24:50.890 26063-26063/? E/AndroidRuntime: at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:897)
10-07 05:24:50.890 26063-26063/? E/AndroidRuntime: at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:508)
10-07 05:24:50.890 26063-26063/? E/AndroidRuntime: at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:726)
10-07 05:24:50.890 26063-26063/? E/AndroidRuntime: at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
10-07 05:24:50.890 26063-26063/? E/AndroidRuntime: at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
10-07 05:24:50.890 26063-26063/? E/AndroidRuntime: at android.database.sqlite.SQLiteDatabase.updateWithOnConflict(SQLiteDatabase.java:1684)
10-07 05:24:50.890 26063-26063/? E/AndroidRuntime: at android.database.sqlite.SQLiteDatabase.update(SQLiteDatabase.java:1632)
10-07 05:24:50.890 26063-26063/? E/AndroidRuntime: at com.barados.myfriendsdebts.DBAdapter.updateExistingFriend(DBAdapter.java:203)
10-07 05:24:50.890 26063-26063/? E/AndroidRuntime: at com.barados.myfriendsdebts.MainActivity.updateExistingDebt(MainActivity.java:259)
10-07 05:24:50.890 26063-26063/? E/AndroidRuntime: at com.barados.myfriendsdebts.MainActivity.access$000(MainActivity.java:44)
10-07 05:24:50.890 26063-26063/? E/AndroidRuntime: at com.barados.myfriendsdebts.MainActivity$1$5.onClick(MainActivity.java:196)
10-07 05:24:50.890 26063-26063/? E/AndroidRuntime: at android.view.View.performClick(View.java:4764)
10-07 05:24:50.890 26063-26063/? E/AndroidRuntime: at android.view.View$PerformClick.run(View.java:19844)
10-07 05:24:50.890 26063-26063/? E/AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:739)
10-07 05:24:50.890 26063-26063/? E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)
10-07 05:24:50.890 26063-26063/? E/AndroidRuntime: at android.os.Looper.loop(Looper.java:135)
10-07 05:24:50.890 26063-26063/? E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5349)
10-07 05:24:50.890 26063-26063/? E/AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
10-07 05:24:50.890 26063-26063/? E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:372)
10-07 05:24:50.890 26063-26063/? E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
10-07 05:24:50.890 26063-26063/? E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
我认为问题在这里:
String where = KEY_NAME +“=”+ name;
但是在任何地方都找不到更好的解决方案。
很好的解释!两种方式摆脱了异常,但只有** String where = KEY_NAME +“='”+ name +“'”; **实际更新了行,“=?”似乎没有做任何事情,不确定每种方法究竟意味着什么,但我会环顾四周,无论如何谢谢你:) –
希望这个链接将解释有关参数绑定https://simonwdixon.wordpress.com/2011/08/ 16/android-sqllite-tip-2-use-compiled-sql-statements /(使用?)通常不使用它在android上不是一个大问题,但对于使用PHP等的web应用程序来说,使用参数绑定总是一个好主意。 – e4c5