SQLiteException没有这样的列user_email

时间:2017-09-24 22:56:56

标签: java android android-sqlite

我发现类似的问题都涉及缺少逗号,空格等。但是,我在代码中找不到类似的内容,所以这些答案对我没有帮助,除非我&#39 ;我的语法完全错过了一些东西。

我想弄清楚为什么我会收到错误

SQLiteException no such column: user_email (code 1):, while compiling: 
SELECT user_id FROM user WHERE user_email=?

当我点击我的注册按钮时。这是我的Register Activity类中的onClick和postDataToSQLite方法:

 /**
 * This implemented method is to listen the click on view
 *
 * @param v
 */
@Override
public void onClick(View v) {
    switch (v.getId()) {

        case R.id.appCompatButtonRegister:
            postDataToSQLite();
            break;

        case R.id.appCompatTextViewLoginLink:
            finish();
            break;
    }
}
/**
 * This method is to validate the input text fields and post data to SQLite
 */
private void postDataToSQLite() {
    if (!inputValidation.isInputEditTextFilled(textInputEditTextName, textInputLayoutName, getString(R.string.error_message_name))) {
        return;
    }
    if (!inputValidation.isInputEditTextFilled(textInputEditTextEmail, textInputLayoutEmail, getString(R.string.error_message_email))) {
        return;
    }
    if (!inputValidation.isInputEditTextEmail(textInputEditTextEmail, textInputLayoutEmail, getString(R.string.error_message_email))) {
        return;
    }
    if (!inputValidation.isInputEditTextFilled(textInputEditTextPassword, textInputLayoutPassword, getString(R.string.error_message_password))) {
        return;
    }
    if (!inputValidation.isInputEditTextMatches(textInputEditTextPassword, textInputEditTextConfirmPassword,
            textInputLayoutConfirmPassword, getString(R.string.error_password_match))) {
        return;
    }

    if (!databaseHelper.checkUser(textInputEditTextEmail.getText().toString().trim())) {

        user.setName(textInputEditTextName.getText().toString().trim());
        user.setEmail(textInputEditTextEmail.getText().toString().trim());
        user.setPassword(textInputEditTextPassword.getText().toString().trim());

        databaseHelper.addUser(user);

        // Snack Bar to show success message that record saved successfully
        Snackbar.make(nestedScrollView, getString(R.string.success_message), Snackbar.LENGTH_LONG).show();
        emptyInputEditText();
    } else {
        // Snack Bar to show error message that record already exists
        Snackbar.make(nestedScrollView, getString(R.string.error_email_exists), Snackbar.LENGTH_LONG).show();
    }
}

这是我的DatabaseHelper类:

package sql;

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.util.ArrayList;
import java.util.List;
import android.database.Cursor;
import modal.User;



/**
 * Created by christopher on 9/21/17.
 */

public class DatabaseHelper extends SQLiteOpenHelper {

//Database Version
private static final int DATABASE_VERSION = 1;

//Database Name
private static final String DATABASE_NAME = "WillowHQ.db";

//User table name
private static final String TABLE_USER = "user";

//User Table Column names
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";

//create table sql query
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" + ")";

//drop table sql query
private String DROP_USER_TABLE = "DROP TABLE IF EXISTS " + TABLE_USER;

/**
 * Constructor
 *
 * @param context
 */
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) {

    //Drop User Table if exists
    db.execSQL(DROP_USER_TABLE);

    //create tables again
    onCreate(db);
}
/**
 * Create user record
 *
 * @param user
 */
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());

    //Inserting Row
    db.insert(TABLE_USER, null, values);
    db.close();
}
/**
 * Fetch all users and return the list of user records
 *
 * @return list
 */
public List<User> getAllUser() {
    //array of columns to fetch
    String[] columns = {
            COLUMN_USER_ID,
            COLUMN_USER_EMAIL,
            COLUMN_USER_NAME,
            COLUMN_USER_PASSWORD
    };
    //sorting orders
    String sortOrder =
            COLUMN_USER_NAME + " ASC";
    List<User> userList = new ArrayList<User>();

    SQLiteDatabase db = this.getReadableDatabase();

    //query the user table
    /**
     * Here query function is used to fetch records from user table this function works like we use sql query.
     * SQL query equivalent to this query function is
     * SELECT user_id,user_name,user_email,user_password FROM user ORDER BY user_name;
     */
    Cursor cursor = db.query(TABLE_USER, columns, null, null, null, null, sortOrder);

    //Traversing through all rows and adding to the list
    if(cursor.moveToFirst()) {
        do {
            User user = new User();
            user.setId(Integer.parseInt(cursor.getString(cursor.getColumnIndex(COLUMN_USER_ID))));
            user.setName(cursor.getString(cursor.getColumnIndex(COLUMN_USER_NAME)));
            user.setEmail(cursor.getString(cursor.getColumnIndex(COLUMN_USER_EMAIL)));
            user.setPassword(cursor.getString(cursor.getColumnIndex(COLUMN_USER_PASSWORD)));
            // Adding user record to list
            userList.add(user);
        } while (cursor.moveToNext());
    }
    cursor.close();
    db.close();

    // return user list
    return userList;
}
/**
 * This method to update user record
 *
 * @param user
 */
public void updateUser(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());

    // updating row
    db.update(TABLE_USER, values, COLUMN_USER_ID + " = ?",
            new String[]{String.valueOf(user.getId())});
    db.close();
}

/**
 * This method is to delete user record
 *
 * @param user
 */
public void deleteUser(User user) {
    SQLiteDatabase db = this.getWritableDatabase();
    // delete user record by id
    db.delete(TABLE_USER, COLUMN_USER_ID + " = ?",
            new String[]{String.valueOf(user.getId())});
    db.close();
}

/**
 * This method to check user exist or not
 *
 * @param email
 * @return true/false
 */
public boolean checkUser(String email) {

    // array of columns to fetch
    String[] columns = {
            COLUMN_USER_ID
    };
    SQLiteDatabase db = this.getReadableDatabase();

    // selection criteria
    String selection = COLUMN_USER_EMAIL + " = ?";

    // selection argument
    String[] selectionArgs = {email};

    // query user table with condition
    /**
     * function is used to fetch records from user table 
     * SQL query equivalent to this query function is
     * SELECT user_id FROM user WHERE user_email = 'my_name@email.com';
     */

        Cursor cursor = db.query(TABLE_USER, //Table to query
                columns,                    //columns to return
                selection,                  //columns for the WHERE clause
                selectionArgs,              //The values for the WHERE clause
                null,                       //group the rows
                null,                      //filter by row groups
                null);                      //The sort order
        int cursorCount = cursor.getCount();
        cursor.close();
        db.close();

    if (cursorCount > 0) {
        return true;
    }
    return false;
}
/**
 * This method to check user exist or not
 *
 * @param email
 * @param password
 * @return true/false
 */
public boolean checkUser(String email, String password) {

    // array of columns to fetch
    String[] columns = {
            COLUMN_USER_ID
    };
    SQLiteDatabase db = this.getReadableDatabase();
    // selection criteria
    String selection = COLUMN_USER_EMAIL + " = ?" + " AND " + COLUMN_USER_PASSWORD + " = ?";

    // selection arguments
    String[] selectionArgs = {email, password};

    // query user table with conditions
    /**
     * Here query function is used to fetch records from user table this function works like we use sql query.
     * SQL query equivalent to this query function is
     * SELECT user_id FROM user WHERE user_email = 'myname@email.com.com' AND user_password = 'whatever';
     */
    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;
  }
}

3 个答案:

答案 0 :(得分:0)

我今天学到了一些东西。我确实在CREATE_USER_TABLE字符串中有语法错误。我查看了Android Studio中的本地历史记录,发现它最初是:

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

新版本是:

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" + ")";

然而,问题是在解决了这个问题之后,我没有从我的模拟器中移除应用程序,这导致了错误。我所要做的就是删除应用程序,然后让onCreate()方法执行它的操作。问题解决了。 : - )

答案 1 :(得分:0)

你可以导出这个表,并检查它。如果不是root,你可以将它复制到另一个文件夹(可操作).suggestion:

  • sqlite code printf to screen

  • 使用简单工具验证其正确性,例如“sqliteMan”

  • 最好首先确认工具上sql的正确性,然后编写代码(自己不要确认代码)

个人意见,不喜欢喷。 我

答案 2 :(得分:0)

在某些情况下,您已经创建了表格列并对其进行了修改,但它并未进行修改。您可以清除缓存或清除应用程序的数据。希望这有效。

相关问题