gpt4 book ai didi

java - 使用 Android 增加 sqlite 数据库中列的值

转载 作者:行者123 更新时间:2023-11-30 05:03:09 26 4
gpt4 key购买 nike

我是 android 的新手,我边学边学。我正在尝试开发一个应用程序,当按下按钮时,它会将列的值递增 1。

这是我用来执行更新查询的代码:

    public void updateItems(String date, String meal){
SQLiteDatabase database = getWritableDatabase();
database.execSQL("Update meal_table SET On_Menu = On_Menu + 1 where date = '"+date+"' and Meal = '"+meal+"'", null);
}

2) 我试过了,它没有给出任何错误,但它也没有更新数据库:


public Cursor updateItems(String sql){
SQLiteDatabase database = getWritableDatabase();
return database.rawQuery(sql, null);
}

这是图像按钮的代码。对于第二个 DatabaseHelper.java fragment ,查询在我的 MainActivity.java 文件中的 imageButton 方法中:


imageButton1.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View arg0) {

Toast.makeText(MenuCheck.this,
"Wonderful!", Toast.LENGTH_SHORT).show();
String date = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(new Date());
sqLiteDatabase.updateItems(date,meal);

}
});

编辑:这是 StackTrace

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.wiseowl.mealrater, PID: 12063
java.lang.IllegalArgumentException: Empty bindArgs
at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1730)
at com.wiseowl.mealrater.DatabaseHelper.updateItems(DatabaseHelper.java:61)
at com.wiseowl.mealrater.MenuCheck$1.onClick(MenuCheck.java:61)
at android.view.View.performClick(View.java:6294)
at android.view.View$PerformClick.run(View.java:24770)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

我希望我的代码做的是让应用更新数据库中我在代码中选择的特定列的值。任何帮助都将非常受欢迎。谢谢

最佳答案

您收到错误是因为您正在使用 execSQL() 的重载:

public void execSQL (String sql, Object[] bindArgs) 

然后您将 null 作为第二个参数传递。
如果你使用这个:

public void execSQL (String sql)

只传递 sql 字符串然后代码就可以工作了:

database.execSQL(
"Update meal_table SET On_Menu = On_Menu + 1 where date = '"+date+"' and Meal = '"+meal+"'"
);

但是这是执行sql语句的错误方式,因为通过连接参数,您对sql injection持开放态度。 .
您可以做的是使用查询获取列 On_Menu 的当前值,然后使用 ContentValues 使用 update() 方法。< br/>现在还有另一种直接使用 rawQuery() 的方法,尽管没有记录在案:

String sql = "Update meal_table SET On_Menu = On_Menu + 1 where date =  ? and Meal = ?";
Cursor cursor = database.rawQuery(sql, new String[] {date, Meal});
cursor.moveToFirst();
cursor.close();
database.close();

这段代码可以正常工作,并且由于它正确传递了参数,所以没有 sql 注入(inject)。

关于java - 使用 Android 增加 sqlite 数据库中列的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57856597/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com