android.database.sqlite.SQLiteException:无此类列:user_id(代码1 SQLITE_ERROR):

时间:2018-07-11 22:35:05

标签: database sqlite android-studio authentication

作为一名Android Studio初学者,我会遇到很多我找不到的小错误,请让我知道我在做错什么,因为我以某种方式尝试了所有其他答案,但并没有得到改善: )

public class DatabaseHelper extends SQLiteOpenHelper{

    private static final int DATABASE_VERSION = 1;

    private static final String DATABASE_NAME = "UserManager.db";

    private static final String TABLE_USER = "user";

    private static final String COLUMN_USER_ID= "user_id";
    private static final String COLUMN_USER_NAME= "user_name";
    private static final String COLUMN_USER_EMAIL= "user_email";
    private static final String COLUMN_USER_PASSWORD= "user_password";

    private String CREATE_USER_TABLE = "CREATE TABLE " + TABLE_USER + "(" + 
    COLUMN_USER_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
    + COLUMN_USER_NAME + " TEXT," + COLUMN_USER_EMAIL + " TEXT," + 
    COLUMN_USER_PASSWORD + " TEXT" + ")";

    private String DROP_USER_TABLE = " DROP TABLE IF EXISTS " + TABLE_USER;

    public DatabaseHelper(Context context){

        super(context, DATABASE_NAME,null, DATABASE_VERSION);

    }

    @Override
    public void onCreate(SQLiteDatabase db){
        db.execSQL(CREATE_USER_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
        db.execSQL(DROP_USER_TABLE);
        onCreate(db);
    }

    public void addUser(User user){
        SQLiteDatabase db= this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(COLUMN_USER_NAME, user.getName());
        values.put(COLUMN_USER_EMAIL, user.getEmail());
        values.put(COLUMN_USER_PASSWORD, user.getPassword());


        db.insert(TABLE_USER,null, values);
        db.close();


    }

    public boolean checkUser(String password, String email){
        String[] columns = {
                COLUMN_USER_ID
        };
        SQLiteDatabase db= this.getWritableDatabase();
        String selection = COLUMN_USER_EMAIL + " = ? " + "AND "+ COLUMN_USER_PASSWORD+" =? ";
        String[] selectionArgs = { email,password };

        Cursor cursor = db.query(TABLE_USER,
                columns,
                selection,
                selectionArgs,
                null,
                null,
                null);
        int cursorCount = cursor.getCount();
        cursor.close();
        db.close();

        if(cursorCount > 0){
            return true;
        }
        return false;
     }
}

我知道logcat让我知道这一点:

07-11 22:08:29.072 9071-9071/com.example.lavinia.sqllogin E/AndroidRuntime: 
FATAL EXCEPTION: main
Process: com.example.lavinia.sqllogin, PID: 9071
android.database.sqlite.SQLiteException: no such column: user_id (code 1 
SQLITE_ERROR): , while compiling: SELECT user_id FROM user WHERE user_email = 
?AND user_password =?

而且我找不到 user_id 的错误用法,我认为我使用得很好,并且在登录自己后该应用程序将停止运行。 (该应用程序具有登录和注册活动-并且注册可以正常进行,但是在Login.activity中按“登录”按钮会使应用程序崩溃)

非常感谢您的支持:)如果需要,我将提供进一步的代码。

1 个答案:

答案 0 :(得分:0)

此问题可能是由于 我往往会遇到很多细微的错误 ,以及对onCreate方法的常见误解。

onCreate方法仅在数据库已经创建并已实际创建时自动自动运行一次。它不会在每次运行该应用程序时运行。

因此,如果在onCreate方法中对结构(表和列)进行了更改/编码,则将不应用对结构(表和列)的任何更改(包括更正)。

开发最简单的解决方法是执行以下3项之一:-

  • 删除应用程序的数据(删除数据库,以便调用onCreate)。
  • 卸载该应用程序(删除数据库,因此将调用onCreate)。
  • 如果onUpgrade方法将删除表,然后调用onCreate,以增加作为第4个参数传递给SQLIteOpenHelper子类(又称为DatabaseHelper类)的数据库版本号)。

执行上述操作之一后,重新运行该应用程序。

请注意,所有现有数据都将丢失。

  • 如果必须保留数据,则修复会更加复杂,但是将基于使用ALTER TABLE语句。