Тема: Видалення колонки з таблиці БД SQLite ( декілька запитань ) .
Я знаю, щоб видалити колонку в БД SQLite треба :
- створити нову таблицю (без колонки яку треба видалити),
- перенести дані зі старої таблиці в нову,
- видалити стару таблицю,
- та переіменувати нову таблицю.
Я для початку створюю копію таблиці , зі всіма колонками (потім збираюсь робити без колонки яку треба видалити). Виникли питання :
1 . Як в цілому мій код (нижче) ?
спочатку я Створюю нову таблицю з однією колонкою ІД.
потім Добавляю в нову таблицю колонки
- Вставляю в нову таблицю строки ( INSERT INTO...). Лишу поле ІД буде заповнене даними
- За допомогою update добавляю дані в інші поля (крім ІД)
2. довелось двічі писати rs = statmt.executeQuery("SELECT * FROM " + tableName); інакше в циклі while не вставлялися дані в нову таблицю. Чому ?
3. Питання стосується двійних та одинарних лапок . Коли треба двійні, а коли двійні та одинарні ?
String sql1Update = " update '"+newTableName+"' set "+colNamesList.get(i)+" = '"+ obj[n]+"' where id = "+ obj[0]+" "; // '"+ obj[n]+"' - пишу в двійних та одинарних лапках. Інакше добавити текстові дані не вдавалося, тільки числа .
4. Ще я не раз використовую Statement statmt та PreparedStatement prstm для виконання різних запитів. Коли їх треба закривати - щоразу після використання чи достатньо одного разу в кінці метода ?
Ось код:
де:
tableName - ім'я старої таблиці
colNamesList - список (колекція імен колонок )
colTypesList - список типів колонок
public void RemoweColumn () {
try {
PreparedStatement prstm =null;
Statement statmt = null;
statmt= conn.createStatement();
rs = statmt.executeQuery("SELECT * FROM " + tableName); // 1-й раз роблю запит
colTypesList.clear();
for(int n=1;n <=colNamesList.size();n++){
colTypesList.add(rs.getMetaData().getColumnTypeName(n));
}
// Створюю нову таблицю з однією колонкою ІД (colNamesList.get(0))
String newTableName = tableName +"Copy";
String sql = "CREATE TABLE ["+newTableName+"] (["+colNamesList.get(0) +"] INTEGER)";
statmt.execute(sql);
//Добавляю в нову таблицю колонки
for(int n=1;n<colNamesList.size(); n++){
String AddColumn = "Alter Table "+newTableName+" ADD '"+colNamesList.get(n) +"' '"+ colTypesList.get (n)+"' " ;
statmt.execute(AddColumn);
}
rs = statmt.executeQuery("SELECT * FROM " + tableName); // 2-й раз доводиться робити запит
// В циклі заповнюю даними нову таблицю
while(rs.next()){
Object[] obj = new Object[colNamesList.size()] ; // В [b] obj [/b] зберігається одна строка
for(int n=0; n<colNamesList.size(); n++){
obj[n] = rs.getObject(colNamesList.get(n));
}
// Вставляю в нову таблицю строки ( INSERT INTO...). Лише поле ІД буде заповнене даними
String sqlInsert = " INSERT INTO '"+newTableName+"' ("+colNamesList.get(0)+") VALUES("+ obj[0]+")";
prstm = conn.prepareStatement(sqlInsert);
prstm.executeUpdate();
if (prstm!=null )prstm.close();
// За допомогою update добавляю дані в інші поля (крім ІД)
for( int n = 1; n< colNamesList.size(); n++){
String sql1Update = " update '"+newTableName+"' set "+colNamesList.get(n)+" = '"+ obj[n]+"' where id = "+ obj[0]+" "; // '"+ obj[n]+"' - пишу в двійних та одинарних лапках. Інакше добавити текстові дані не вдавалося, тільки числа .
prstm = conn.prepareStatement(sql1Update);
prstm.executeUpdate();
if (prstm!=null )prstm.close();
}
}
if (statmt!=null )statmt.close();
if (prstm!=null ) try {
prstm.close();
} catch (SQLException ex) {
Logger.getLogger(TM.class.getName()).log(Level.SEVERE, null, ex);
}
} catch (SQLException ex) {
Logger.getLogger(TM.class.getName()).log(Level.SEVERE, null, ex);
}
}