-1

我已将名称传递给我的数据库,我想通过它提取该名称的详细信息。我正在尝试这样做。我该如何解决?“名称”是点击的名称。我想用这个参数来查询数据库并获取这个名字的相关信息。

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;
}

日志猫

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

这意味着表中不存在这些列中的一个或多个。您可能在数据库表或查询中拼写错误。检查这些。

于 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 回答