SQLite将值存储为一列的-1,但其他列也没问题

问题描述 投票:0回答:2

在我的应用程序中,我最近在我现有的表事务中添加了新列SUB_CATEGORY_ID。在我用sub_category_id值作为任何整数插入记录后,当我查询表并检查它时,为sub_category_id返回值为-1,其余的列都没问题。我在插入之前检查了sub_category_id的值,它不是null并且具有1,2,...等整数值但是它仍然将值保存为-1。

有什么建议。请在下面找到我的代码。

添加交易的代码:

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();
android sqlite android-sqlite
2个回答
1
投票

许多人首先陷入陷阱,假设每次运行onCreate方法,并且只需更改用于创建表的SQL即可实现更改模式(添加/删除表或列)。

onCreate方法仅在创建数据库时自动运行。因此通常不会进行此类更改。

实现此类架构更改的最简单方法是删除应用程序的数据或卸载应用程序。第三种简单的方法,如果编写onUpgrade方法删除表然后调用onCreate方法,则通过增加数据库版本号来使onUpgrade方法运行。

请注意,上述所有三种方法都会导致数据丢失。前两个删除数据库导致重新创建它。数据库本身不会被第三个删除,而是删除(删除)指定的表,然后重新创建。

如果丢失现有数据是一个问题,那么您可以使用onUpgrade方法来实现保留数据的更改。例如,您可以使用ALTER TABLE tablename ADD COLUMN your_new_column column_type(您可以使用DEFAULT value将列设置为默认值)。

EG

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

将名为mynewcolumn的列添加到名为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,相同),这不起作用。

SQL As Understood By SQLite - ALTER TABLE


0
投票

您在表格创建后添加新列时更新了表格,因此您必须实现覆盖方法,请看下面这样:

@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");
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.