2015-10-07 94 views
2

我有一个名称和一个数字(债务)表 我想要做的是当用户输入一个新的数字到一个现有的名字,数字被添加到初始号,如果 它首先检查名称存在,如果它不那么它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;

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

回答

0

你认为问题在那里是非常正确的。在产生错误的特定情况下,您显然正在处理一个名为tal的人。 但

String where = KEY_NAME +“=”+ name;

产生如下

名=塔尔

这是告诉sqlite的比较列名,其列塔尔这显然不存在。您可以用名称将名称变量磨掉

String where = KEY_NAME +“='”+ name +“'”;

但是,这绝对不是正确的答案。正确的答案是修改查询的这一部分,使其看起来像其余部分。

String where = KEY_NAME +“=?”;

即使用准备好的语句并绑定参数,因为您显然是在为其他字段做的事情。

+0

很好的解释!两种方式摆脱了异常,但只有** String where = KEY_NAME +“='”+ name +“'”; **实际更新了行,“=?”似乎没有做任何事情,不确定每种方法究竟意味着什么,但我会环顾四周,无论如何谢谢你:) –

+0

希望这个链接将解释有关参数绑定https://simonwdixon.wordpress.com/2011/08/ 16/android-sqllite-tip-2-use-compiled-sql-statements /(使用?)通常不使用它在android上不是一个大问题,但对于使用PHP等的web应用程序来说,使用参数绑定总是一个好主意。 – e4c5