-1

データベースに名前を渡しました。この名前を使用して、その名前の詳細を抽出します。私はこれをやろうとしています。どうすれば解決できますか?「name」はクリックされた名前です。このパラメーターを使用してデータベースにクエリを実行し、この名前の関連情報を取得したいと思います。

public String getName(String name) {
    // TODO Auto-generated method stub
            String namereturned = "";
    String[] columns = new String[] { KEY_ROWID, KEY_NAME,
            KEY_PERSONALPHONE, KEY_HOMEPHONE, KEY_OFFICEPHONE };
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_NAME + "="
            + name +"'", null, null, null, null);
    if (c != null) {
        c.moveToFirst();
            return  namereturned = c.getString(1);


    }
    return null;
}

LOG CAT

10-04 15:15:05.954: E/AndroidRuntime(760): FATAL EXCEPTION: main
10-04 15:15:05.954: E/AndroidRuntime(760): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.contactlist/com.example.contactlist.ViewContact}: android.database.sqlite.SQLiteException: unrecognized token: "'" (code 1): , while compiling: SELECT _id, Name, Personalnumber, Homenumber, Officenumber FROM ContactList WHERE Name=nishanth'
10-04 15:15:05.954: E/AndroidRuntime(760):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
10-04 15:15:05.954: E/AndroidRuntime(760):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
10-04 15:15:05.954: E/AndroidRuntime(760):  at android.app.ActivityThread.access$600(ActivityThread.java:130)
10-04 15:15:05.954: E/AndroidRuntime(760):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
10-04 15:15:05.954: E/AndroidRuntime(760):  at android.os.Handler.dispatchMessage(Handler.java:99)
10-04 15:15:05.954: E/AndroidRuntime(760):  at android.os.Looper.loop(Looper.java:137)
10-04 15:15:05.954: E/AndroidRuntime(760):  at android.app.ActivityThread.main(ActivityThread.java:4745)
10-04 15:15:05.954: E/AndroidRuntime(760):  at java.lang.reflect.Method.invokeNative(Native Method)
10-04 15:15:05.954: E/AndroidRuntime(760):  at java.lang.reflect.Method.invoke(Method.java:511)
10-04 15:15:05.954: E/AndroidRuntime(760):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
10-04 15:15:05.954: E/AndroidRuntime(760):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-04 15:15:05.954: E/AndroidRuntime(760):  at dalvik.system.NativeStart.main(Native Method)
10-04 15:15:05.954: E/AndroidRuntime(760): Caused by: android.database.sqlite.SQLiteException: unrecognized token: "'" (code 1): , while compiling: SELECT _id, Name, Personalnumber, Homenumber, Officenumber FROM ContactList WHERE Name=nishanth'
10-04 15:15:05.954: E/AndroidRuntime(760):  at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
10-04 15:15:05.954: E/AndroidRuntime(760):  at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882)
10-04 15:15:05.954: E/AndroidRuntime(760):  at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493)
10-04 15:15:05.954: E/AndroidRuntime(760):  at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
10-04 15:15:05.954: E/AndroidRuntime(760):  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
10-04 15:15:05.954: E/AndroidRuntime(760):  at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
10-04 15:15:05.954: E/AndroidRuntime(760):  at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
10-04 15:15:05.954: E/AndroidRuntime(760):  at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
10-04 15:15:05.954: E/AndroidRuntime(760):  at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1161)
10-04 15:15:05.954: E/AndroidRuntime(760):  at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1032)
10-04 15:15:05.954: E/AndroidRuntime(760):  at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1200)
10-04 15:15:05.954: E/AndroidRuntime(760):  at com.example.contactlist.DBContact.getName(DBContact.java:138)
10-04 15:15:05.954: E/AndroidRuntime(760):  at com.example.contactlist.ViewContact.onCreate(ViewContact.java:31)
10-04 15:15:05.954: E/AndroidRuntime(760):  at android.app.Activity.performCreate(Activity.java:5008)
10-04 15:15:05.954: E/AndroidRuntime(760):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
10-04 15:15:05.954: E/AndroidRuntime(760):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
10-04 15:15:05.954: E/AndroidRuntime(760):  ... 11 more
4

3 に答える 3

5

クエリを次のように変更してみてください

 Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_NAME + "='"
            + name +"'", null, null, null, null);
于 2012-10-04T10:33:50.850 に答える
1

次の行を参照してください。

Caused by: android.database.sqlite.SQLiteException: no such column: nishanth (code 1): , while compiling: SELECT _id, Name, Personalnumber, Homenumber, Officenumber FROM ContactList WHERE Name=nishanth

これは、これらの列の1つ以上がテーブルに存在しないことを意味します。データベーステーブルまたはクエリでそれらのスペルが間違っている可能性があります。これらをチェックしてください。

于 2012-10-04T10:35:57.603 に答える
0

スタックトレースに基づいて、実行しているクエリは次のとおりです。

SELECT _id, Name, Personalnumber, Homenumber, Officenumber 
FROM ContactList 
WHERE Name = nishanth

Rajeevが言うように、たとえばwhereステートメントの前後に一重引用符(または二重引用符)を追加する必要があります。

SELECT _id, Name, Personalnumber, Homenumber, Officenumber 
FROM ContactList 
WHERE Name = 'nishanth'

また

SELECT _id, Name, Personalnumber, Homenumber, Officenumber 
FROM ContactList 
WHERE Name = "nishanth"

SQLiteデータベースで同様のクエリを直接実行しました(http://www.vogella.com/articles/AndroidSQLite/article.htmlセクション「9.SQLiteデータベースに直接アクセスする」を参照してください。寄付することを忘れないでください;-))。一重引用符と二重引用符の両方の結果を返しました。

引用符が削除されると、同じエラーメッセージが生成されます。

エラー:そのような列はありません:ABC123

ここで、ABC123が制約として使用されました。

私見では。Eclipseや、使用しているIDEやプログラミング言語の外部で、データベースに対してSQLをテストする場合、少なくともSQL構文が正しいことがわかります。呼び出し元のコードに戻って、問題を特定します。

「=」を使用しているため、これは非常に具体的であり、テキストの大文字と小文字が変わると一致しません。「nishanth」と「Nishanth」は完全に異なります。

これは罠です……

データベースにデータを挿入する前に、ユーザー入力を大文字( "NISHANTH")または小文字( "nishanth")に変更することを好みます。このようにして、データベースから値を取得し、それを制約として使用すると、一致することがわかります。

本当に凝ったものにしたい場合は、データベースに挿入する前に、たとえば大文字から大文字までの文字列値を解析するクラスを作成し、画面に値を表示するときにその逆を実行します。

この説明が役立つと信じてください。幸運を。

于 2012-10-04T14:29:15.813 に答える