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

标签 java android sqlite android-sqlite

我是 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/

相关文章:

java - 使用 CoordinatorLayout 时如何消除抽屉导航在工具栏上转换的阴影

Android-7.0 : EditText wrong actionId in editor actionlistener

java - clojure 应用程序 - lein uberjar 抑制编译时输出

java - 通过 URL 数据嵌入 Java 小程序

java - java中的百分比函数

java - 将值插入 android sqlite 数据库的最快方法

sql - 删除最新的冗余行并更新时间戳

utf-8 - SQLite UTF-8 编码

java - Tomcat 上的 SpringBoot : Error creating bean with name 'jacksonObjectMapperBuilder'

java - 为什么最后一个线程没有被中断?