Измените таблицу и добавьте столбец, но проверьте, существует ли этот столбец или нет в Android Studio. - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь обновить базу данных.поэтому ниже метод вызывается.

Есть 5 таблиц.Я хочу изменить только 1table, который является последним.Но когда вызывается onupgrade, последняя таблица еще не создана и не может изменить ее по методу Onupgrade.

 @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int currentVersion) {

После создания таблицы.Я хотел проверить, существует ли столбец, если нет, то измените таблицу. Я пробовал приведенный ниже код, но он не работает

 public static void createuserTable(SQLiteDatabase db, String tableName) {

    final String table = "CREATE TABLE IF NOT EXISTS "
                    + tableName + " (_id INTEGER PRIMARY KEY AUTOINCREMENT, user_name TEXT, addressTEXT, phone TEXT, phone2 TEXT)";

     Cursor cursor = db.rawQuery(table , null); // grab cursor for all data
            int deleteStateColumnIndex = cursor.getColumnIndex("email");  // see if the column is there
            if (deleteStateColumnIndex < 0) {
                // missing_column not there - add it
                Log.d("value dont exist","value dont exist");
            }
        db.execSQL(table);

      }

1 Ответ

1 голос
/ 07 июня 2019

Теоретически вы должны знать, существует столбец или нет, следуя определенному режиму обновления.

Однако, если столбец легко идентифицировать, вы можете использовать: -

public void createuserTable (SQLiteDatabase db, String tableName) {

    //Force table to exist (if it doesn't then why not include the email column in the definition? (rhetorical))
    final String table = "CREATE TABLE IF NOT EXISTS "
            + tableName + " (_id INTEGER PRIMARY KEY AUTOINCREMENT, user_name TEXT, addressTEXT, phone TEXT, phone2 TEXT)";

    String columnName = "email"; //<<<<<<<<<< change as appropriate
    String columnDefinition = " TEXT UNIQUE "; //<<<<<<<<<< change as appropriate
    Cursor cursor;
    if (((
            cursor = db.query(
                    "sqlite_master",
                    new String[]{
                            "sql"
                    },
                    "sql LIKE ? AND type = 'table' AND name = ?", 
                    new String[]{
                            "%" + columnName + "%",
                            tableName
                    }, 
                    null,
                    null,
                    null
                            )).getCount() < 0)){ 
        db.execSQL("ALTER TABLE " + tableName +" ADD COLUMN " + columnName + columnDefinition);
    }
    cursor.close();
}
  • Конечно, имя столбца не должно конфликтовать с другим именем столбца, которое включает имя нового столбца.

    • например, если имя нового столбца должно быть col1 и сказать, что существует столбец с именем thisiscol1, то, поскольку col1 будет считаться частью col1, команда ALTER не будет выполнена.
  • Выше приведен принципиальный код, он не был проверен или выполнен, поэтому может содержать некоторые ошибки.

...