0

我正在尝试实现一个数据库来存储有关 Android 应用程序用户的信息。

这是一个字符串:

private static final String DATABASE_CREATE = 

                 "CREATE TABLE "

                  + DATABASE_TABLE_USERS 
                  + "(" + KEY_ROW_ID 
                  + " INTEGER PRIMARY KEY AUTOINCREMENT," 
                  + KEY_NAME

                  + " TEXT NOT NULL," 
                  + KEY_PASSWORD 
                  + " TEXT NOT NULL," 
                  + KEY_LOGIN_ATTEMPTS 
                  + " INTEGER NOT NULL," 
                  + KEY_ZIP + " TEXT," 
                  + KEY_STREET + " TEXT," + KEY_EMAIL + " TEXT NOT NULL);";

我使用这个字符串在 OnCreate 方法中调用 db.execSQL(DATABASE_CREATE)。

我认为这是发生错误的地方:

            public boolean findPerson(String uid, String password) {
                String [] columns = new String [] {DB_Helper.KEY_NAME, DB_Helper.KEY_PASSWORD};
                Cursor c = database.query(DB_Helper.DATABASE_TABLE_USERS, columns,"KEY_PASSWORD = ? AND KEY_NAME = ?",
                new String[] { password, uid },
                null,
                null,
                null);


                 if(!c.moveToFirst()){
                c.close();
               return false;
                  }
                 else c.close();

    return true;
}

我立即得到一个异常,说我找不到列 KEY_PASSWORD。

这是日志文件:

02-25 21:20:56.426: D/MainActivity(2257): 点击保存按钮

02-25 21:20:56.695: E/SQLiteLog(2257): (1) 没有这样的列:KEY_PASSWORD

02-25 21:20:56.695: D/AndroidRuntime(2257): 关闭 VM

02-25 21:20:56.705: W/dalvikvm(2257): threadid=1: 线程以未捕获的异常退出 (group=0x40a70930)

02-25 21:20:56.775:E/AndroidRuntime(2257):致命异常:主要

02-25 21:20:56.775: E/AndroidRuntime(2257): java.lang.IllegalStateException: 无法执行活动的方法

02-25 21:20:56.775: E/AndroidRuntime(2257): 在 android.view.View$1.onClick(View.java:3597)

02-25 21:20:56.775: E/AndroidRuntime(2257): 在 android.view.View.performClick(View.java:4202)

02-25 21:20:56.775: E/AndroidRuntime(2257): 在 android.view.View$PerformClick.run(View.java:17340)

02-25 21:20:56.775: E/AndroidRuntime(2257): 在 android.os.Handler.handleCallback(Handler.java:725)

02-25 21:20:56.775: E/AndroidRuntime(2257): 在 android.os.Handler.dispatchMessage(Handler.java:92)

02-25 21:20:56.775: E/AndroidRuntime(2257): 在 android.os.Looper.loop(Looper.java:137)

02-25 21:20:56.775: E/AndroidRuntime(2257): 在 android.app.ActivityThread.main(ActivityThread.java:5039)

02-25 21:20:56.775: E/AndroidRuntime(2257): 在 java.lang.reflect.Method.invokeNative(Native Method)

02-25 21:20:56.775: E/AndroidRuntime(2257): 在 java.lang.reflect.Method.invoke(Method.java:511)

02-25 21:20:56.775: E/AndroidRuntime(2257): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)

02-25 21:20:56.775: E/AndroidRuntime(2257): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)

02-25 21:20:56.775: E/AndroidRuntime(2257): at dalvik.system.NativeStart.main(Native Method)

02-25 21:20:56.775:E/AndroidRuntime(2257):由:java.lang.reflect.InvocationTargetException 引起

02-25 21:20:56.775: E/AndroidRuntime(2257): 在 java.lang.reflect.Method.invokeNative(Native Method)

02-25 21:20:56.775: E/AndroidRuntime(2257): 在 java.lang.reflect.Method.invoke(Method.java:511)

02-25 21:20:56.775: E/AndroidRuntime(2257): 在 android.view.View$1.onClick(View.java:3592)

02-25 21:20:56.775: E/AndroidRuntime(2257): ... 11 更多

02-25 21:20:56.775: E/AndroidRuntime(2257): 由: android.database.sqlite.SQLiteException: 没有这样的列: KEY_PASSWORD (code 1): , 编译时: SELECT id_name, id_password FROM reg_users_table WHERE KEY_PASSWORD = ? 和 KEY_NAME = ?

02-25 21:20:56.775: E/AndroidRuntime(2257): 在 android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)

02-25 21:20:56.775: E/AndroidRuntime(2257): 在 android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882)

02-25 21:20:56.775: E/AndroidRuntime(2257): 在 android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493)

02-25 21:20:56.775: E/AndroidRuntime(2257): 在 android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)

02-25 21:20:56.775: E/AndroidRuntime(2257): 在 android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:58)

02-25 21:20:56.775: E/AndroidRuntime(2257): 在 android.database.sqlite.SQLiteQuery.(SQLiteQuery.java:37)

02-25 21:20:56.775: E/AndroidRuntime(2257): 在 android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)

02-25 21:20:56.775: E/AndroidRuntime(2257): 在 android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)

02-25 21:20:56.775: E/AndroidRuntime(2257): 在 android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1161)

02-25 21:20:56.775: E/AndroidRuntime(2257): 在 android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1032)

02-25 21:20:56.775: E/AndroidRuntime(2257): 在 android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1200)

02-25 21:20:56.775: E/AndroidRuntime(2257): 在 com.example.wheresmystuff.Model.DB.findPerson(DB.java:57)

02-25 21:20:56.775: E/AndroidRuntime(2257): at com.example.wheresmystuff.Presenter.Login_Presenter.validate(Login_Presenter.java:26)

02-25 21:20:56.775: E/AndroidRuntime(2257): 在 com.example.wheresmystuff.View.MainActivity.save(MainActivity.java:48)

02-25 21:20:56.775: E/AndroidRuntime(2257): ... 14 更多

4

3 回答 3

2

KEY_PASSWORD 是一个 java 变量名,不一定是实际的 SQL 列名。仔细检查您拥有的实际 SQL 名称

于 2013-02-25T21:41:21.887 回答
1

该错误非常不言自明。您的选择正在查找表中不存在的列 (KEY_NAME和)。KEY_PASSWORD该错误甚至为您提供了已编译的 SQL,因此您可以看到您的错误:

SELECT id_name, id_password FROM reg_users_table WHERE KEY_PASSWORD = ? AND KEY_NAME = ?

将您的选择更改为KEY_PASSWORD + " = ? AND " + KEY_NAME + " = ?"

于 2013-02-25T21:46:31.970 回答
0

这应该有帮助

Cursor c = database.query(DB_Helper.DATABASE_TABLE_USERS, columns,DB_Helper.KEY_PASSWORD + "= ? AND " DB_Helper.KEY_NAME + "= ?"
于 2016-06-15T09:54:06.200 回答