Как исправить "SQLite без столбца исключение"?

Я занимаюсь разработкой приложения для Android, которое сохраняет пользовательскую информацию, зарегистрированную в SQLite. Но я сталкиваюсь со странной проблемой. В моем классе DBHelper функция создания таблиц создана нормально, функция вставки не выдает никаких исключений, но когда я пытаюсь извлечь данные из моей базы данных SQL Lite, она выдает исключение

нет такого столбца: сотрудник (Sqlite код 1):, при компиляции: выберите * из пользователя, где userId= сотрудник, (ошибка ОС - 2: нет такого файла или каталога)

Я пытался изменить имя базы данных и версию много раз, но ничего не получалось. Я пытался просмотреть файл базы данных с моего устройства Android, чтобы убедиться, что моя таблица создана нормально, но когда я искал в папке Android /data на моем телефоне, все имена пакетов приложений отображаются там, но имя пакета моего приложения там нет.

public class DBHelper extends SQLiteOpenHelper {
// Database Name
private static final String DATABASE_NAME = "CMDB.db";
private static final int DATABASE_VERSION = 2;
// Contacts table name
private static final String TABLE_USER = "User";
public static DBHelper dbHelper;


public DBHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

public static DBHelper getInstance(Context context) {
    if (dbHelper == null) {
        dbHelper = new DBHelper(context.getApplicationContext());
    }
    return dbHelper;
}

@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
    createTables(sqLiteDatabase);
    Toast.makeText(App.context,"onCreate",Toast.LENGTH_SHORT).show();



}

private void createTables(SQLiteDatabase sqLiteDatabase) {
    try {
    sqLiteDatabase.execSQL(" CREATE TABLE " + TABLE_USER + " (" +
                "userId" + " TEXT PRIMARY KEY," + "userImage" + " TEXT NOT NULL," +
                "userRole" + " TEXT NOT NULL," + "token" + " TEXT NOT NULL," + "userName" + " TEXT NOT NULL,"  + "userEmail" + " TEXT NOT NULL," + "userAddress" + " TEXT NOT NULL," + "mobile" + " TEXT NOT NULL);"
        );
        Toast.makeText(App.context,"createTables",Toast.LENGTH_SHORT).show();
    }catch (Exception ex){
        Toast.makeText(App.context,ex.getMessage(),Toast.LENGTH_SHORT).show();

        ex.printStackTrace();
    }

}

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    dropTables(sqLiteDatabase);

    // Create tables again
    onCreate(sqLiteDatabase);
}

private void dropTables(SQLiteDatabase sqLiteDatabase) {
    sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_USER);

}

public void saveUserToDB(User user) {
    try {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put("userId", user.userID);
        values.put("userImage", user.userImage);
     values.put("userRole", user.userRole);
        values.put("token", user.token);
        values.put("UserName", user.UserName);
        values.put("userEmail", user.userEmail);
        values.put("userAddress", user.userAddress);
        values.put("mobile", user.mobile);

        db.insert(TABLE_USER, null, values);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

public User getUserFromDB(String userid) {
    User user = new User();
    try {
        SQLiteDatabase db = this.getReadableDatabase();
        String query = "Select * from " + TABLE_USER + " where userId=" +userid+ "";

        Cursor cursor = db.rawQuery(query, null);
        if (cursor != null) {
            cursor.moveToFirst();

            user.userID = cursor.getString(0);
            user.userImage = cursor.getString(1);
         user.userRole = cursor.getString(2);
            user.token = cursor.getString(3);
            user.UserName = cursor.getString(4);
            user.userEmail = cursor.getString(5);
            user.userAddress = cursor.getString(6);
            user.mobile = cursor.getString(7);
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return user;

}

public void updateUser(User user, String userId) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    Gson gson = new Gson();
    String userJson = gson.toJson(user);
    contentValues.put("user", userJson);
    db.update(TABLE_USER, contentValues, "userId=" + userId, null);
}

public void updateUser(User user) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues cv = new ContentValues();
    cv.put("userId", user.userID);
    cv.put("userImage", user.userImage);
  cv.put("userRole", user.userRole);
    cv.put("token", user.token);
    cv.put("UserName", user.UserName);

    cv.put("userEmail", user.userEmail);
    cv.put("userAddress", user.userAddress);
    cv.put("mobile", user.mobile);

    db.update(TABLE_USER, cv, "userId=" + user.userID, null);
}}

Я ожидаю, что БД SQLite будет создана с пользовательской таблицей и упомянутыми столбцами. Также необходимо увидеть файл.db в Android Device.

2 ответа

Решение

Согласно исключению вы упомянули:

"нет такого столбца: сотрудник (Sqlite код 1): при компиляции: выберите * из пользователя, где userId= сотрудник, (ошибка ОС - 2: нет такого файла или каталога)"

У вас есть ошибка в значении для userIdт.е. officer,

Попробуйте добавить одну цитату до и после нее, как показано ниже:

String query = "Select * from " + TABLE_USER + " where userId='" + userid + "'";

Пожалуйста, опубликуйте полную трассировку ошибки, чтобы мы могли правильно проверить ее. Из приведенного выше кода и объяснения я вижу одну возможность следующего запроса

sqLiteDatabase.execSQL(" CREATE TABLE " + TABLE_USER + " (" +
                "userId" + " TEXT PRIMARY KEY," + "userImage" + " TEXT NOT NULL," +
                "userRole" + " TEXT NOT NULL," + "token" + " TEXT NOT NULL," + "userName" + " TEXT NOT NULL,"  + "userEmail" + " TEXT NOT NULL," + "userAddress" + " TEXT NOT NULL," + "mobile" + " TEXT NOT NULL);"

ключ userName не то же самое, что UserName в коде ниже

public void updateUser(User user) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues cv = new ContentValues();
    cv.put("userId", user.userID);
    cv.put("userImage", user.userImage);
  cv.put("userRole", user.userRole);
    cv.put("token", user.token);
    cv.put("UserName", user.UserName);

    cv.put("userEmail", user.userEmail);
    cv.put("userAddress", user.userAddress);
    cv.put("mobile", user.mobile);

    db.update(TABLE_USER, cv, "userId=" + user.userID, null);
}}

Примечание. Имя столбца в БД всегда чувствительно к регистру.