Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android SQLite正在尝试更新一个字段_Java_Android_Sqlite - Fatal编程技术网

Java Android SQLite正在尝试更新一个字段

Java Android SQLite正在尝试更新一个字段,java,android,sqlite,Java,Android,Sqlite,我的代码如下,但它使我的应用程序崩溃。我对db的工作还很陌生,但这似乎是有道理的。有没有迹象表明这可能不起作用 public void updateLevel(String level){ mDb.rawQuery("UPDATE "+ DATABASE_TABLE + " SET " + KEY_CUR_LEVEL + " = " + level + " WHERE " + KEY_NAME + " = Default", null); } 默认

我的代码如下,但它使我的应用程序崩溃。我对db的工作还很陌生,但这似乎是有道理的。有没有迹象表明这可能不起作用

 public void updateLevel(String level){
             mDb.rawQuery("UPDATE "+ DATABASE_TABLE + " SET " + KEY_CUR_LEVEL + " = " + level + " WHERE " + KEY_NAME + " = Default", null);
         }
默认值被解释为列名;如果是字符串,则必须使用“Default”

为了避免像这样的格式问题,建议使用参数,这些参数在SQL命令中写为?。它们从rawQuery的第二个参数中的对应条目或其他SQL函数的类似参数中获取值。 这比在字符串中放置“环绕字符串,记住转义”更容易,并且使使用带有控制字符的字符串成为可能

mDb.rawQueryUPDATE+数据库_表+ 设置+键当前级别+=+级别+ 其中+键\名称+=?, 新字符串[]{Default}; 默认值被解释为列名;如果是字符串,则必须使用“Default”

为了避免像这样的格式问题,建议使用参数,这些参数在SQL命令中写为?。它们从rawQuery的第二个参数中的对应条目或其他SQL函数的类似参数中获取值。 这比在字符串中放置“环绕字符串,记住转义”更容易,并且使使用带有控制字符的字符串成为可能

mDb.rawQueryUPDATE+数据库_表+ 设置+键当前级别+=+级别+ 其中+键\名称+=?, 新字符串[]{Default}; 我看到两个问题:

1由于SQL注入,使用rawQuery是不可取的。如果可能,请使用

2如果列的类型为varchar,则值应在单引号中

例如:

mDb.rawQuery("UPDATE "+ DATABASE_TABLE + " SET " + KEY_CUR_LEVEL + " = '" + level + "' WHERE " + KEY_NAME + " = 'Default'", null);
注意:上面的查询是手工输入的,可能有语法错误。

我发现两个问题:

1由于SQL注入,使用rawQuery是不可取的。如果可能,请使用

2如果列的类型为varchar,则值应在单引号中

例如:

mDb.rawQuery("UPDATE "+ DATABASE_TABLE + " SET " + KEY_CUR_LEVEL + " = '" + level + "' WHERE " + KEY_NAME + " = 'Default'", null);
注意:上面的查询是手工输入的,可能有语法错误。

我发现使用该方法不太容易出现人为错误

ContentValues cv = new ContentValues();
cv.put(KEY_CUR_LEVEL, level);

mDb.update(DATABASE_TABLE, cv, "? = ?", new String[] { KEY_NAME, "Default"});
我发现使用这种方法不太容易出现人为错误

ContentValues cv = new ContentValues();
cv.put(KEY_CUR_LEVEL, level);

mDb.update(DATABASE_TABLE, cv, "? = ?", new String[] { KEY_NAME, "Default"});

感谢您的输入,但由于我不是从用户那里获取文本,我相信我不必担心SQL注入。@EGHDK:SQL注入不仅仅是因为用户输入,如果该键已经存储了任何特殊字符,则可能会出现这种情况。如果您对该问题不太敏感,可以忽略并继续进行第2点修复。请欣赏输入,但由于我没有从用户处获取文本,我相信我不必担心SQL注入。@EGHDK:SQL注入不仅仅是因为用户输入,如果该键已存储了任何特殊字符,则可能会出现这种情况。如果您对该问题不太敏感,可以忽略并继续使用point 2 fix.Perfect。你的第一个建议奏效了。我不知道你使用参数是什么意思。想解释一下吗?我建议将级别参数化以避免SQLinjection@CJBSAndroid数据库API只有字符串参数。完美。你的第一个建议奏效了。我不知道你使用参数是什么意思。想解释一下吗?我建议将级别参数化以避免SQLinjection@CJBSAndroid数据库API只有字符串参数。列名不能用作参数。CL和Vyrx均为+1。我不会为列名使用占位符,但一般来说,我也发现使用API的这一部分比使用rawQuery更可取。列名不能用作参数。CL和Vyrx都使用+1。我不会为列名使用占位符,但总的来说,我还发现使用API的这一部分比使用rawQuery更可取。