我在android sqlite中创建表。 我的表是类别:
db.execSQL(“CREATE TABLE IF NOT EXISTS”类别(id_category INTEGER PRIMARY KEY AUTOINCREMENT,子INT(5),名称VARCHAR,父INT(5), income_bool INT(1));“);
现在我创建一个变量:
String a="بنزین"
我成功插入一行(使用波斯名称)并在listview中显示;
> But when i select i have errors: String ROW3 = "SELECT * FROM category
> WHERE name=" + a;
>Cursor cursor = db.rawQuery(ROW3, null);
>cursor.moveToFirst();
>Log.d("ghable vorod be for", "sa");
>for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext())
{
Log.d("ghable vorod be for1", "sa");
cat_id=(cursor.getColumnIndex("id_category"));
Log.d("ghable vorod be for2", "sa");
}
但我在logcat中有这个错误:
sqlite返回:错误代码= 1,msg =没有这样的列:بنزین
关闭VM
线程以未捕获的异常退出(group = 0x40015560) E / AndroidRuntime(28713):致命异常:主
android.database.sqlite.SQLiteException:没有这样的列:بنزین:, 编译时:SELECT * FROM category WHERE name =بنزین
09-30 15:28:17.358:E / AndroidRuntime(28713):at android.database.sqlite.SQLiteCompiledSql.native_compile(母语 方法)09-30 15:28:17.358:E / AndroidRuntime(28713):at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:92) 09-30 15:28:17.358:E / AndroidRuntime(28713):at android.database.sqlite.SQLiteCompiledSql。(SQLiteCompiledSql.java:65) 09-30 15:28:17.358:E / AndroidRuntime(28713):at android.database.sqlite.SQLiteProgram。(SQLiteProgram.java:83) 09-30 15:28:17.358:E / AndroidRuntime(28713):at android.database.sqlite.SQLiteQuery。(SQLiteQuery.java:49)09-30 15:28:17.358:E / AndroidRuntime(28713):at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:42) 09-30 15:28:17.358:E / AndroidRuntime(28713):at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1356) 09-30 15:28:17.358:E / AndroidRuntime(28713):at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1324) 09-30 15:28:17.358:E / AndroidRuntime(28713):at com.example.hesabdar.New_income.onClick(New_income.java:174)09-30 15:28:17.358:E / AndroidRuntime(28713):at android.view.View.performClick(View.java:2485)09-30 15:28:17.358: E / AndroidRuntime(28713):at android.view.View $ PerformClick.run(View.java:9080)09-30 15:28:17.358: E / AndroidRuntime(28713):at android.os.Handler.handleCallback(Handler.java:587)09-30 15:28:17.358:E / AndroidRuntime(28713):at android.os.Handler.dispatchMessage(Handler.java:92)09-30 15:28:17.358:E / AndroidRuntime(28713):at android.os.Looper.loop(Looper.java:123)09-30 15:28:17.358: E / AndroidRuntime(28713):at android.app.ActivityThread.main(ActivityThread.java:3683)09-30 15:28:17.358:E / AndroidRuntime(28713):at java.lang.reflect.Method.invokeNative(Native Method)09-30 15:28:17.358:E / AndroidRuntime(28713):at java.lang.reflect.Method.invoke(Method.java:507)09-30 15:28:17.358: E / AndroidRuntime(28713):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839) 09-30 15:28:17.358:E / AndroidRuntime(28713):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)09-30 15:28:17.358:E / AndroidRuntime(28713):at dalvik.system.NativeStart.main(Native Method)09-30 15:33:17.468: I /处理(28713):发送信号。 PID:28713 SIG:9
答案 0 :(得分:3)
您根本不应该直接在SQL中包含该值。而是使用参数化SQL ,例如:
Cursor cursor = db.rawQuery("SELECT * FROM category WHERE name=?",
new String[] { a });
那样:
(在普通的JDBC中,您可以为String以外的其他数据类型设置参数,避免转换问题 - 看起来在这里不太可用,但它是参数化SQL的常见好处。)
答案 1 :(得分:2)
对于数据库中的普通字符串值插入,我们有一个方法,在开始和结束时附加'
字符,'
字符的所有出现都由''
替换。
public String FormatDBString(String StringToFormat)
{
if (StringToFormat == null || StringToFormat.equals(""))
{
return "'"+ "" + "'";
}
else
return "'" + StringToFormat.replace("'", "''") + "'";
}
然后您可以将此功能用作
String ROW3 = "SELECT * FROM category WHERE name= " + FormatDBString(a)
这个函数提供了可用性,因为我们必须编写这么多的SQL,并且错误的机会,SQL注入等也被最小化。