Android 正在尝试添加到SQLite数据库中的现有值

Android 正在尝试添加到SQLite数据库中的现有值,android,sqlite,Android,Sqlite,我有一张有名字和数字的桌子(债务) 我想做的是,当用户向现有名称输入一个新编号时,该编号会添加到初始编号中, 它首先检查名称是否存在,如果不存在,则插入新行-此操作有效- 如果名称不存在,它应该更新现有的债务,如上所述-但它不起作用,更新就是我需要帮助的地方 现在我得到了一个SQLiteException,据我所知,更新中的WHERE不好,尝试了几种方法来解决这个问题,但都不起作用,仍然得到了异常 以下是相关代码: 首先是DatabaseHelper类中的方法,该方法指出异常也是主要问题: pu

我有一张有名字和数字的桌子(债务) 我想做的是,当用户向现有名称输入一个新编号时,该编号会添加到初始编号中, 它首先检查名称是否存在,如果不存在,则插入新行-此操作有效-
如果名称不存在,它应该更新现有的债务,如上所述-但它不起作用,更新就是我需要帮助的地方

现在我得到了一个
SQLiteException
,据我所知,更新中的
WHERE
不好,尝试了几种方法来解决这个问题,但都不起作用,仍然得到了异常

以下是相关代码: 首先是
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)
10-07 05:24:50.890 26063-26063/?E/AndroidRuntime:android.database.sqlite.SQLiteException:没有这样的列:Tal(代码1):,编译时:updatemaindembtset date=?,name=?,debt=?其中name=Tal
10-07 05:24:50.890 26063-26063/? E/AndroidRuntime:at-android.database.sqlite.SQLiteConnection.nativePrepareStatement(本机方法)
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.(SQLiteProgram.java:58)
10-07 05:24:50.890 26063-26063/? E/AndroidRuntime:at-android.database.sqlite.SQLiteStatement.(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:com.barados.myfriendsdebts.DBAdapter.updateExistingFriend(DBAdapter.java:203)
10-07 05:24:50.890 26063-26063/? E/AndroidRuntime:com.barados.myfriendsdebts.MainActivity.updateExistingDebt(MainActivity.java:259)
10-07 05:24:50.890 26063-26063/? E/AndroidRuntime:com.barados.myfriendsdebts.MainActivity.access$000(MainActivity.java:44)
10-07 05:24:50.890 26063-26063/? E/AndroidRuntime:com.barados.myFriendsDBTS.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.handle.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(本机方法)
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:com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
10-07 05:24:50.890 26063-26063/? E/AndroidRuntime:com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
我认为问题在于:

字符串,其中=键\名称+“=”+名称


但是在任何地方都没有找到更好的解决方案。

你认为问题就在那里,这是非常正确的。在产生错误的特定实例中,您显然是在与一个名为tal的人打交道。 但是

字符串,其中=键\名称+“=”+名称

产生以下结果

name=Tal

它告诉sqlite比较列名,而Tal列显然不存在。可以使用引号对名称变量进行排序

字符串,其中=KEY_NAME+“=”+NAME+“”

但这肯定不是正确的答案。正确的答案是修改查询的这一部分,使其与其余部分类似

字符串,其中=KEY_NAME+“=?”


ie使用预先准备好的语句并绑定参数,就像您对其他字段所做的那样。

很好的解释!这两种方法都消除了异常,但只删除了字符串where=KEY_NAME+“='”+NAME+“”;实际上更新了行,“=?”似乎没有做任何事情,不确定每个方法的确切含义,但我会四处看看,无论如何,谢谢:)希望此链接将解释参数绑定(使用?)通常不使用它在android上不是一个大问题,但对于使用PHP等的web应用程序,使用参数绑定总是一个好主意。