簡體   English   中英

SQLite將一列的值存儲為-1,但其他列也可以

[英]SQLite stores value as -1 for one column, but other columns are fine

最近,在我的應用程序中,我向現有的表事務中添加了新列SUB_CATEGORY_ID 在我插入帶有sub_category_id值為任何整數的值的記錄后,當我查詢表並檢查它為sub_category_id返回值時為-1,其余的列都可以。 我在插入sub_category_id之前檢查了它的值,該值不為null,並且具有1,2,...之類的整數。

有什么建議么。 請在下面找到我的代碼。

添加交易的代碼:

public int addTransaction(int categoryId, int subCategoryId, int accountId, double amount,
                          String notes, String trxType, String subTrxType, int sourceTrxId) {

    Log.d("addTransaction", "before addTransaction "+subCategoryId);
    int flag=0;

    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(CATEGORY_ID_COL, categoryId);
    contentValues.put(ACCOUNT_ID_COL, accountId);
    contentValues.put(AMOUNT_COL, amount);
    contentValues.put(DUE_DATE_COL, getDateTime());
    contentValues.put(CREATION_DATE, getDateTime());
    contentValues.put(NOTES_COL, notes);
    contentValues.put(TRANSACTION_TYPE_COL, trxType);
    contentValues.put(TRANSACTION_SUB_TYPE_COL, subTrxType);
    contentValues.put(SOURCE_TRX_ID_COL, sourceTrxId);
    contentValues.put(SUB_CATEGORY_ID_COL, subCategoryId);
    db.insert(TRANSACTIONS_TABLE_NAME, null, contentValues);
    flag=1;
    return flag;
}

查詢事務記錄的代碼為sub_category_id列返回-1:

    String selectQuery1 = "SELECT TRX."+CATEGORY_ID_COL+", TRX."+SUB_CATEGORY_ID_COL+" from "+TRANSACTIONS_TABLE_NAME
            +" AS TRX ORDER BY DATETIME(TRX."+CREATION_DATE+") DESC LIMIT 50";
Cursor c1 = db.rawQuery(selectQuery1, null);
    if(c1.moveToFirst()){
        do{
            Log.d("fetchAllTrx", " CetgId="+c1.getLong(0)+" 
subcatgid="+c1.getLong(1));
        }while (c1.moveToNext());
    }
    c1.close();

最初,很多人會陷入一個陷阱,即假設onCreate方法每次都運行,並且更改模式(添加/刪除表或列)可以通過僅更改用於創建表的SQL來實現。

onCreate方法僅在創建數據庫時自動運行。 因此,通常不會進行此類更改。

實現此類架構更改的最簡單方法是刪除應用程序的數據或卸載應用程序。 第三種簡單的方法是, 如果已編寫onUpgrade方法以刪除表,然后調用onCreate方法 ,則可以通過增加數據庫版本號來使onUpgrade方法運行。

請注意,上述所有三種方法都將導致數據丟失。 前兩個刪除導致重新創建數據庫的數據庫。 數據庫本身不會被第三個刪除,而是刪除(刪除)指定的表然后重新創建。

如果丟失現有數據是一個問題,則可以使用onUpgrade方法來實現保留數據的更改。 例如,您可以使用ALTER TABLE tablename ADD COLUMN your_new_column column_type (可以使用DEFAULT value將列設置為默認值)。

例如

 ALTER TABLE mytable ADD COLUMN mynewcolumn TEXT DEFAULT 'nothing as yet' 

將添加一個名為mynewcolumn柱,用TEXT的列類型(關聯),以名為MyTable的表和所有行會具有什么價值尚未

注意! 以上所有假定您正在使用數據庫助手(即SQLiteOpenHelper類的子類((即它擴展了SQLiteOpenHelper)))。

替代問題

如果使用ALTER添加列,則存在一些限制。

您不能添加具有UNIQUE或PRIMARY INDEX約束的列。 由於您的列名表示一個id列,因此您可能已經嘗試過類似

String youraltersql = "ALTER TABLE "+TRANSACTIONS_TABLE_NAME+" ADD COLUMN " + SUB_CATEGORY_ID_COL + " INTEGER PRIMARY KEY"

由於INTEGER PRIMARY KEY(如果具有AUTOINCREMENT,則相同),此操作將不起作用。

SQLite理解的SQL-ALTER TABLE

您在創建表格之后在添加新Column的同時更新了表格,因此您必須實現Override方法,如下所示:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  // If you need to add a column
  if (newVersion > oldVersion) {
     db.execSQL("ALTER TABLE "Your Table name"ADD COLUMN "new column "INTEGER DEFAULT 0");
  }
}

暫無
暫無

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

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