-1

for my update i want to search corrent pos using inspectionid, activityid, subactivityid but when calling update state ment im getting this error.can some one help.

public int updateSubActivityActivityComment(String comment, int rating, int subActivityId, int activityId, int inspectionId){
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();

    contentValues.put(KEY_RATING, rating);
    contentValues.put(KEY_COMMENT, comment);

    return db.updateWithOnConflict(TABLE_INSPECTION, contentValues,KEY_SUB_ACTIVITY_ID+ " = ? "+subActivityId+" AND "+KEY_INSPECTION_ID + " = ? "+inspectionId +" AND "+KEY_ACTIVITY_ID +" = ? "+activityId,new String[]{String.valueOf(subActivityId)} ,SQLiteDatabase.CONFLICT_IGNORE);
}

Log Cat-

java.lang.IllegalArgumentException: Too many bind arguments.  3 arguments were provided but the statement needs 2 arguments.
                                                     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:68)
                                                     at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
                                                     at android.database.sqlite.SQLiteDatabase.updateWithOnConflict(SQLiteDatabase.java:1574)
                                                     at com.theavo.ck_app.DatabaseHelper.updateSubActivityActivityComment(DatabaseHelper.java:264)
                                                     at com.theavo.ck_app.FragmentSubInspectionComment.onClick(FragmentSubInspectionComment.java:470)
                                                     at android.view.View.performClick(View.java:4780)
                                                     at android.view.View$PerformClick.run(View.java:19866)
                                                     at android.os.Handler.handleCallback(Handler.java:739)
                                                     at android.os.Handler.dispatchMessage(Handler.java:95)
                                                     at android.os.Looper.loop(Looper.java:135)
                                                     at android.app.ActivityThread.main(ActivityThread.java:5254)
                                                     at java.lang.reflect.Method.invoke(Native Method)
                                                     at java.lang.reflect.Method.invoke(Method.java:372)
                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Iamat8
  • 3,888
  • 9
  • 25
  • 35
hash
  • 5,336
  • 7
  • 36
  • 59

2 Answers2

5

You should pass three values here

String[] whereArgs =  new String[]{String.valueOf(subActivityId),String.valueOf(inspectionId),String.valueOf(activityId)};

db.updateWithOnConflict(TABLE_INSPECTION, contentValues,KEY_SUB_ACTIVITY_ID+ " = ? "+" AND "+KEY_INSPECTION_ID + " = ? "+" AND "+KEY_ACTIVITY_ID +" = ? ",whereArgs ,SQLiteDatabase.CONFLICT_IGNORE);
M D
  • 47,665
  • 9
  • 93
  • 114
1

Use updateWithOnConflict method as by passing 4th parameter as null and remove ? from 3rd parameter:

db.updateWithOnConflict(TABLE_INSPECTION,contentValues,
          KEY_SUB_ACTIVITY_ID+ " = "
          +subActivityId+" AND "+KEY_INSPECTION_ID + " = "
          +inspectionId +" AND "+KEY_ACTIVITY_ID +" = "
          +activityId,null ,SQLiteDatabase.CONFLICT_IGNORE);

because already passing values with column names in 3rd parameter then no need to pass it again.

ρяσѕρєя K
  • 132,198
  • 53
  • 198
  • 213