如何在android中的sqlite中使用波斯变量?

时间:2013-10-25 15:40:31

标签: java android sqlite select persian

我在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

2 个答案:

答案 0 :(得分:3)

您根本不应该直接在SQL中包含该值。而是使用参数化SQL ,例如:

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

那样:

  • 您无需担心应如何表示非ASCII
  • 您无需担心转义数据以避免SQL injection attacks
  • 您的SQL更容易阅读,没有所有字符串连接

(在普通的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注入等也被最小化。