簡體   English   中英

檢查Android SQLite數據庫中的特定列

[英]Check for specific column in Android SQLite database

我試圖在調用onUpgrade()時檢查我的數據庫中是否有特定的列。 有沒有一種簡單的方法來檢查

if(database does not have specific column){
db.execSQL("ALTER TABLE table" + " ADD COLUMN column" );
}

我看到了其他一些答案, Pragma Table ,但我不知道如何使用它,甚至不知道它是什么。

找到了解決方案

    try {
            db.execSQL("ALTER TABLE notes" + " ADD COLUMN Week");
        } catch (SQLException e) {
            Log.i("ADD COLUMN Week", "Week already exists");
        }

好的,在你遇到更大的問題之前,你應該知道SQLite在ALTER TABLE命令上是有限的,它允許addrename不刪除/刪除,這是通過重新創建表來完成的。

您應始終擁有新的表創建查詢,並將其用於升級和傳輸任何現有數據。 注意:onUpgrade方法為您的sqlite幫助程序對象運行一個,您需要處理其中的所有表。

那么推薦使用什么升級:

  • 的BeginTransaction
  • 運行一個表創建, if not exists (我們正在進行升級,因此表可能還不存在,它將失敗更改和刪除)
  • 列表中的現有列List<String> columns = DBUtils.GetColumns(db, TableName);
  • 備份表( ALTER table " + TableName + " RENAME TO 'temp_" + TableName
  • 創建新表(最新的表創建模式)
  • 獲取與新列的交集,這次是從升級的表中獲取的columns.retainAll(DBUtils.GetColumns(db, TableName));
  • 恢復數據( String cols = StringUtils.join(columns, ","); db.execSQL(String.format( "INSERT INTO %s (%s) SELECT %s from temp_%s", TableName, cols, cols, TableName));
  • 刪除備份表( DROP table 'temp_" + TableName
  • setTransactionSuccessful

(這不會處理表降級,如果重命名列,則不會因列名不匹配而傳輸現有數據)。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM