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

时间:2017-12-26 07:31:41

标签: android sqlite android-sqlite

我最近在我的应用程序中添加了新列SUB_CATEGORY_ID到我现有的表交易。插入带有sub_category_id值的记录作为任何整数后,当我查询表并检查它时,返回值为-1,sub_category_id其余列都没问题。我在插入之前检查了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();

2 个答案:

答案 0 :(得分: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' 将列设置为默认值。)

  

e.g。

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

将添加一个名为 mynewcolumn 的列,其中包含一列   TEXT的类型(亲和力),名为 mytable 的表和所有行   会有尚未的值。

请注意!以上所有假设您使用的是数据库帮助程序(即SQLiteOpenHelper类的子类((即它扩展了SQLiteOpenHelper))。

替代问题

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

您无法添加具有UNIQUE或PRIMARY INDEX约束的列。由于您的列名称表示id列,因此您可能尝试了类似

的内容
<PNode>
  <CNode1>Node1</CNode1>
  <CNode2>Node2</CNode2>
  <CNode3>
     <CCNode1>CCValue1</CCNode1>
     <CCNode2>CCValue2</CCNode2>
  </CNode3>
  <CNode3>
     <CCNode1>CCValue3</CCNode1>
     <CCNode2>CCValue4</CCNode2>
  </CNode3></PNode>

由于INTEGER PRIMARY KEY(如果你有AUTOINCREMENT,则无效)。

SQL As Understood By SQLite - ALTER TABLE

答案 1 :(得分: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");
  }
}