4

Android アプリケーションのログイン ページ用に、 SQLiteデータベースから情報を取得しようとしています。データベースから取得するためのコードは次のとおりです。

login.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            SQLiteDatabase db = SQLiteDatabase.openDatabase("/data/data/com.example.androidproject/databases/myDB", null, 0);
            // Check Login
            String username = usernamelogin.getText().toString();
            String password = loginpassword.getText().toString();

            Cursor c = db.rawQuery("SELECT name, password FROM User WHERE name='?' AND password='?'", new String[] {username, password});
            if(c.moveToFirst()) {
                Intent intent=new Intent(Login.this, MainActivity.class);
                 startActivity(intent);
            } else {
                Toast.makeText(getApplicationContext(), "Invalid", Toast.LENGTH_LONG).show();
            }
            c.close();
            db.close();
        }
    });  

しかし、私はこのエラーを受け取り続けます:

03-12 20:38:40.216: E/AndroidRuntime(691): FATAL EXCEPTION: main
03-12 20:38:40.216: E/AndroidRuntime(691): java.lang.IllegalArgumentException: Cannot bind argument at index 2 because the index is out of range.  The statement has 0 parameters.
03-12 20:38:40.216: E/AndroidRuntime(691):  at android.database.sqlite.SQLiteProgram.bind(SQLiteProgram.java:212)
03-12 20:38:40.216: E/AndroidRuntime(691):  at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:166)
03-12 20:38:40.216: E/AndroidRuntime(691):  at android.database.sqlite.SQLiteProgram.bindAllArgsAsStrings(SQLiteProgram.java:200)
03-12 20:38:40.216: E/AndroidRuntime(691):  at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47)
03-12 20:38:40.216: E/AndroidRuntime(691):  at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
03-12 20:38:40.216: E/AndroidRuntime(691):  at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1253)
03-12 20:38:40.216: E/AndroidRuntime(691):  at com.example.androiddiet.Login$2.onClick(Login.java:61)
03-12 20:38:40.216: E/AndroidRuntime(691):  at android.view.View.performClick(View.java:4084)
03-12 20:38:40.216: E/AndroidRuntime(691):  at android.view.View$PerformClick.run(View.java:16966)
03-12 20:38:40.216: E/AndroidRuntime(691):  at android.os.Handler.handleCallback(Handler.java:615)
03-12 20:38:40.216: E/AndroidRuntime(691):  at android.os.Handler.dispatchMessage(Handler.java:92)
03-12 20:38:40.216: E/AndroidRuntime(691):  at android.os.Looper.loop(Looper.java:137)
03-12 20:38:40.216: E/AndroidRuntime(691):  at android.app.ActivityThread.main(ActivityThread.java:4745)
03-12 20:38:40.216: E/AndroidRuntime(691):  at java.lang.reflect.Method.invokeNative(Native Method)
03-12 20:38:40.216: E/AndroidRuntime(691):  at java.lang.reflect.Method.invoke(Method.java:511)
03-12 20:38:40.216: E/AndroidRuntime(691):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
03-12 20:38:40.216: E/AndroidRuntime(691):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
03-12 20:38:40.216: E/AndroidRuntime(691):  at dalvik.system.NativeStart.main(Native Method)
4

3 に答える 3

20

置換文字を引用符で囲まないでください:

WHERE name=? AND password=?

を使用すると、文字通りの疑問符name='?'と比較しようとします...name

于 2013-03-12T20:45:09.573 に答える
5

あなたが尋ねた質問には答えていませんが、まだ尋ねていない質問です.UIスレッドでデータベース操作を実行しています. これは間違いなく、onClick の代わりに AsyncTask を使用してこのデータベース操作コードを配置することを検討してください。

于 2013-03-12T20:54:09.873 に答える
2

同様のエラーも発生しました。

問題は、等号演算子の前後のスペースでした。

WHERE fieldName = ?からまでのスペースを削除して問題を修正しましたWHERE fieldName=?

于 2014-04-29T05:44:56.697 に答える