2017-09-24 2 views
0

Je trouve des questions similaires qui impliquent toutes des virgules manquantes, des espaces blancs, etc. Cependant, je ne trouve rien de tel dans mon code, donc ces réponses ne m'aident pas ici, sauf si je J'ai complètement manqué quelque chose dans ma syntaxe.SQLiteException aucune colonne de ce type user_email

J'essaie de comprendre pourquoi je reçois l'erreur

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

lorsque je clique sur mon bouton Enregistrer. Voici les méthodes onClick et postDataToSQLite de mon registre classe d'activité:

/** 
* 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(); 
    } 
} 

Voici ma classe 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 = '[email protected]'; 
    */ 

     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 = '[email protected]' 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; 
    } 
} 
+1

Est-il possible que cette table ait été créée avant l'ajout de la colonne user_email à la requête create table? –

Répondre

0

j'appris quelque chose aujourd'hui. J'ai effectivement eu une erreur de syntaxe dans ma chaîne CREATE_USER_TABLE. Je regardais dans mon histoire locale dans Android Studio et découvert qu'il était à l'origine:

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

Et la nouvelle version est:

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

Cependant, le problème est que après avoir résolu ce problème, Je n'ai pas supprimé l'application de mon émulateur, ce qui causait l'erreur. Tout ce que je devais faire était de supprimer l'application, et laisser la méthode onCreate() faire son truc. Problème résolu. :-)

0

vous pouvez exporter cette table, et vérifiez it.if pas root, vous pouvez le copier dans un autre dossier (utilisable) .suggestion:

  • Code sqlite printf de cribler

  • Utilisez un outil simple pour vérifier son exactitude, comme « sqliteman »

  • Il est préférable de commencer par confirmer l'exactitude de l'sql sur l'outil, puis écrire le code (pour leur propre ne confirment pas le code)

Opinion personnelle, n'aime pas pulvériser. i

0

Dans certains cas, vous avez déjà créé des colonnes de table et vous les avez modifiées, mais elles ne sont pas modifiées. Vous pouvez effacer le cache ou effacer les données de l'application. J'espère que cela fonctionne.