【问题标题】:SQLite stores value as -1 for one column, but other columns are fineSQLite 将一列的值存储为 -1,但其他列很好
【发布时间】:2017-12-26 18:47:42
【问题描述】:

在我最近的应用程序中,我已将新列 SUB_CATEGORY_ID 添加到现有表 transactions 中。在我将sub_category_id 值作为任何整数插入记录后,当我查询表并检查它返回值为-1 时sub_category_id 其余列都很好。我在插入之前检查了sub_category_id 的值,它不为空并且具有像 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


【解决方案1】:

很多人一开始会陷入一个陷阱,假设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 的表和所有行 将具有 nothing as yet 的值。

注意!以上所有假设您使用的是数据库助手(即 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

【讨论】:

  • 嗨迈克,感谢您的回复。是的,我正在使用数据库助手,并且仅使用 OnUpgrade 方法。它适用于以前的更改,现在数据库版本为 4。仅在本专栏中,我遇到了问题。
  • 我已经根据列的名称以及您所说的应该是 1,2,用另一个潜在问题更新了答案,..... 这似乎表明您正在尝试添加第二个主索引列。如果没有,那么您应该编辑您的问题以包含 Databasehelper 以及您包含的 Logging 的示例输出。
  • 迈克,我只是添加整数列,没有任何限制。也存在 onUpgrade 方法。我有你已经提出的所有观点。似乎一切都很好。但只有 -1 存储在该列中。我也尝试过清理项目并重建,但问题仍然存在。
  • @Sundar 你似乎没有注意到第二句话如果没有,你应该编辑你的问题......尤其是@产生的输出987654331@ 正如您似乎在说插入的行但值为 -1 并且该行显示插入到 rouge 列中的值。
【解决方案2】:

您在创建表格后添加新列时更新了表格,因此您必须实施覆盖方法,看看这个:

@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");
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    相关资源
    最近更新 更多