Добавление поля в существующую базу данных sqlite - PullRequest
2 голосов
/ 15 марта 2011

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

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

Возможно ли это?

Ответы [ 3 ]

10 голосов
/ 15 марта 2011

Да, это так,

Вам необходимо написать свой метод onUpgrade() при обновлении таблицы. В настоящее время я использую следующее для создания новой таблицы с новым столбцом и для копирования всех моих текущих данных. Надеюсь, вы сможете адаптировать это к своему коду.

@Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion);

            db.beginTransaction();
            try {
                db.execSQL("CREATE TABLE IF NOT EXISTS " + DATABASE_UPGRADE);
                List<String> columns = GetColumns(db, DATABASE_TABLE);
                db.execSQL("ALTER table " + DATABASE_TABLE + " RENAME TO 'temp_" + DATABASE_TABLE + "'");
                db.execSQL("create table " + DATABASE_UPGRADE);
                columns.retainAll(GetColumns(db, DATABASE_TABLE));
                String cols = join(columns, ","); 
                db.execSQL(String.format( "INSERT INTO %s (%s) SELECT %s from temp_%s", DATABASE_TABLE, cols, cols, DATABASE_TABLE));
                db.execSQL("DROP table 'temp_" + DATABASE_TABLE + "'");
                db.setTransactionSuccessful();
            } finally {
                db.endTransaction();
            }
        }
    }

    public static List<String> GetColumns(SQLiteDatabase db, String tableName) {
        List<String> ar = null;
        Cursor c = null;
        try {
            c = db.rawQuery("select * from " + tableName + " limit 1", null);
            if (c != null) {
                ar = new ArrayList<String>(Arrays.asList(c.getColumnNames()));
            }
        } catch (Exception e) {
            Log.v(tableName, e.getMessage(), e);
            e.printStackTrace();
        } finally {
            if (c != null)
                c.close();
        }
        return ar;
    }

    public static String join(List<String> list, String delim) {
        StringBuilder buf = new StringBuilder();
        int num = list.size();
        for (int i = 0; i < num; i++) {
            if (i != 0)
                buf.append(delim);
            buf.append((String) list.get(i));
        }
        return buf.toString();
    }

Содержит onUpgrade() и два вспомогательных метода. DATABASE_UPGRADE - строка, содержащая базу данных обновления:

private static final String DATABASE_UPGRADE =
    "notes (_id integer primary key autoincrement, "
    + "title text not null, "
    + "body text not null, "
    + "date text not null, "
    + "edit text not null, "
    + "reminder text, "
    + "img_source text, "
    + "deletion, "
    + "priority)";

Краткое примечание о том, как это работает:

  1. Проверьте, существует ли текущая версия таблицы (она никогда не должна существовать), так как onUpgrade() не должна вызываться в этом случае.
  2. Поскольку это не удалось, получите список столбцов из текущей таблицы (используется вспомогательная функция GetColumns()).
  3. переименуйте старую таблицу в temp_OLDTABLENAME.
  4. Создать в новой версии базы данных дополнительные столбцы (в настоящее время пустые).
  5. получить всю информацию из старой версии базы данных.
  6. вставить его в новую базу данных
  7. удалить старую таблицу (temp_OLDTABLENAME).

Я попытался написать это достаточно универсально, поэтому все, что мне нужно сделать, это обновить DATABASE_UPGRADE дополнительными столбцами, и это обрабатывает все остальное. До сих пор у меня работало до 3-х апгрейдов.

1 голос
/ 15 марта 2011

Используйте метод onUpgrade SQLiteOpenHelper для запуска операторов "alter table".

1 голос
/ 15 марта 2011

Вы можете добавить столбцы, используя ALTER TABLE .

ALTER TABLE my_table ADD COLUMN location ...;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...