2

android sqlite でテーブルを作成します。私のテーブルはカテゴリです:

db.execSQL("CREATE TABLE IF NOT EXISTS category (id_category INTEGER PRIMARY KEY AUTOINCREMENT,sub INT(5),name VARCHAR ,father INT(5), Income_bool INT(1));");

今、私は変数を作成します:

String a="بنزین"

行を正常に(ペルシャ語の名前で)挿入し、リストビューに表示します。

> 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、メッセージ = そのような列はありません:

VM をシャットダウンしています

キャッチされない例外 (group=0x40015560) で終了するスレッド E/AndroidRuntime(28713): FATAL EXCEPTION: main

android.database.sqlite.SQLiteException: そのような列はありません: エラー: 、コンパイル中: SELECT * FROM カテゴリ WHERE name=エラー

Android.app.ActivityThread.main(ActivityThread.java:3683) 09-30 15:28:17.358: E/AndroidRuntime(28713): java.lang.reflect.Method.invokeNative(ネイティブ メソッド) 09-30 15: 28:17.358: E/AndroidRuntime(28713): java.lang.reflect.Method.invoke(Method.java:507) 09-30 15:28:17.358: E/AndroidRuntime(28713): com.android.internal .os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 09-30 15:28:17.358: E/AndroidRuntime(28713): com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 09-30 15:28:17.358: E/AndroidRuntime(28713): dalvik.system.NativeStart.main(ネイティブ メソッド) 09-30 15:33:17.468: I/Process(28713): シグナルを送信しています。PID: 28713 SIG: 9 invokeNative(ネイティブ メソッド) 09-30 15:28:17.358: E/AndroidRuntime(28713): java.lang.reflect.Method.invoke(Method.java:507) 09-30 15:28:17.358: E/AndroidRuntime (28713): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 09-30 15:28:17.358: E/AndroidRuntime(28713): com.android.internal.os で。 ZygoteInit.main(ZygoteInit.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 SIG: 9 invokeNative(ネイティブ メソッド) 09-30 15:28:17.358: E/AndroidRuntime(28713): java.lang.reflect.Method.invoke(Method.java:507) 09-30 15:28:17.358: E/AndroidRuntime (28713): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 09-30 15:28:17.358: E/AndroidRuntime(28713): com.android.internal.os で。 ZygoteInit.main(ZygoteInit.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 SIG: 9 internal.os.ZygoteInit.main(ZygoteInit.java:597) 09-30 15:28:17.358: E/AndroidRuntime(28713): dalvik.system.NativeStart.main(ネイティブ メソッド) 09-30 15:33:17.468 : I/Process(28713): シグナルを送信しています。PID: 28713 SIG: 9 internal.os.ZygoteInit.main(ZygoteInit.java:597) 09-30 15:28:17.358: E/AndroidRuntime(28713): dalvik.system.NativeStart.main(ネイティブ メソッド) 09-30 15:33:17.468 : I/Process(28713): シグナルを送信しています。PID: 28713 SIG: 9

4

2 に答える 2

3

値を SQL に直接含めるべきではありません。代わりに、次のようなパラメーター化された SQLを使用します。

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

その方法:

  • 非ASCIIの表現方法について心配する必要はありません
  • SQL インジェクション攻撃を回避するためにデータをエスケープすることを心配する必要はありません
  • 文字列を連結しなくても、SQL が読みやすくなります。

(通常の JDBC では、文字列以外のデータ型のパラメーターを設定して、変換の問題も回避できます。ここではあまり利用できないようですが、パラメーター化された SQLの一般的な利点です。)

于 2013-10-25T15:45:10.650 に答える
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 インジェクションなどの可能性も最小限に抑えられるため、この機能は使いやすさを提供します。

于 2013-10-25T15:57:02.183 に答える