我在android sqlite中创建表。
我的表是类别:
db.execsql(“如果类别不存在,则创建表(id\u category integer
主键自动递增,sub int(5),name varchar,父int(5),
收入(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=没有这样的列:___
关闭虚拟机
线程因未捕获异常而退出(组=0x40015560)
e/androidruntime(28713):致命异常:main
android.database.sqlite.sqliteexception:没有这样的列:___:,
编译时:从name=___的类别中选择*
09-30 15:28:17.358:E/AndroidRuntime(28713):在
android.database.sqlite.sqlitecompiledsql.native_compile(本机
方法)09-30 15:28:17.358:e/androidruntime(28713):at
Android .Dava.SQLite .SQLITECOMPELD.SQL.编译(SQLITECOMPELD.SQL.java:92)
09-30 15:28:17.358:E/AndroidRuntime(28713):在
Android .Dava.SQLite .SQLITECOMPRIDPEDSQL(SQLITECOMPELD.SQL.Java:65)
09-30 15:28:17.358:E/AndroidRuntime(28713):在
Android .Dava.SQLite .SQLeTeal.(SQLeTeal.java:83)
09-30 15:28:17.358:E/AndroidRuntime(28713):在
Android .Dava.SQLite .SQLITIALI.(SQLITHALY.java:49)09-30
15:28:17.358:E/AndroidRuntime(28713):在
Android .Dava.SQLite .SQLeIdTr.CursRoosix.Queq(SQLeIdTr.CuroSoRoj.java:42)
09-30 15:28:17.358:E/AndroidRuntime(28713):在
Android .Dava.SQLite .SQLeDeATabase.RWQueRayWuite工厂(SQLITEDATABASE . Java:1356)
09-30 15:28:17.358:E/AndroidRuntime(28713):在
Android .Dava.SQLite .SQLeDATabase.RWQu查询(SQLeDeATabase.java:1324)
09-30 15:28:17.358:E/AndroidRuntime(28713):在
com .Heasabdar .NexLay.OnCutter(NexLay.Java:174)09-30
15:28:17.358:E/AndroidRuntime(28713):在
Android .view .View .PyFraskCutt(View .java:2485)0930:15:28:17.358:
E/AndroidRuntime(28713):在
Auto.View查看$PrimultCalk.Run(view .java:9080)0930:15:28:17.358:
E/AndroidRuntime(28713):在
安卓.OS.Helper-HooLeCalBeBead(Hyder-Java:587)09-30
15:28:17.358:E/AndroidRuntime(28713):在
Addio.OS.Halder-Debug消息(处理程序. Java:92)09-30
15:28:17.358:E/AndroidRuntime(28713):在
安卓.OS.Looper-Loo.(Looper-Java:123)0930:15:28:17.358:
E/AndroidRuntime(28713):在
安卓(主:3683)
15:28:17.358:E/AndroidRuntime(28713):在
Java.Lang.Eng.Simult.FutoEnnistic(原生方法)09-30
15:28:17.358:E/AndroidRuntime(28713):在
Java.Lang.Eng.Simult.Voice(方法.java:507)0930:15:28:17.358:
E/AndroidRuntime(28713):在
COM.Android .No.OS.ZyGoTynIt $方法和AgsCalal.Run(ZyGoTynIt.java:839)
09-30 15:28:17.358:E/AndroidRuntime(28713):在
COM.Android .No.OS.ZyGoTeNIT.MUN(ZyGoTeNIT.java:597)09-30
15:28:17.358:E/AndroidRuntime(28713):在
dalvik.system.nativestart.main(本地方法)09-30 15:33:17.468:
I/处理(28713):发送信号。PID:28713信号:9

最佳答案

您根本不应该将该值直接包含在sql中。相反,请使用参数化SQL,例如:

Cursor cursor = db.rawQuery("SELECT * FROM category WHERE name=?",
                            new String[] { a });

这样:
您不必担心非ascii应该如何表示
您无需担心转义数据以避免SQL injection attacks
不需要所有的字符串连接,您的sql更容易阅读。
(在普通的JDBC中,您可以为字符串以外的其他数据类型设置参数,这样也可以避免转换问题—看起来这在这里不太可用,但这是参数化SQL的一个常见优点。)

08-03 19:21