Sqlite:如何将行值增加+1?

Sqlite:如何将行值增加+1?,sqlite,android-cursor,content-values,Sqlite,Android Cursor,Content Values,我有一个TOTALCOUNT表,它有一个PK _id列和一个整数列CARDNUM。我想将CARDNUM的默认值设置为零。然后,每次将新行插入数据库时,将CARDNUM增加+1。因此,5行插入将为行ID 1到5生成1,2,3,4,5。当我将数据推送到我的RecyclerView中的各个CardView时,我只得到默认值零。前五个CardView应显示CARDNUM值,因此为1,2,3,4,5。我错过了什么 数据库合同文件: ... public static final String TABLE_

我有一个TOTALCOUNT表,它有一个PK _id列和一个整数列CARDNUM。我想将CARDNUM的默认值设置为零。然后,每次将新行插入数据库时,将CARDNUM增加+1。因此,5行插入将为行ID 1到5生成1,2,3,4,5。当我将数据推送到我的RecyclerView中的各个CardView时,我只得到默认值零。前五个CardView应显示CARDNUM值,因此为1,2,3,4,5。我错过了什么

数据库合同文件:

...
public static final String TABLE_NAME_TOTALCOUNT = "totalcount";
    public static final String COLUMN_NAME_COUNTID = "_id";
    public static final String COLUMN_NAME_CARDNUM = "cardnum";
    }
}

    A second table, not shown is called USERINPUTS.
DBHelper文件:

...
public void onCreate(SQLiteDatabase db) {
    // Set up the Column headings for USERINPUTS and TOTALCOUNT Tables.
    db.execSQL(SQL_CREATE_ENTRIES);
    db.execSQL(SQL_CREATE_CARDNUM);

private static final String SQL_CREATE_CARDNUM =
    "CREATE TABLE IF NOT EXISTS "+ DBContract.DBEntry.TABLE_NAME_TOTALCOUNT +
            "( "+ DBContract.DBEntry.COLUMN_NAME_COUNTID +
            " INTEGER PRIMARY KEY , "+
            DBContract.DBEntry.COLUMN_NAME_CARDNUM +
            " INTEGER);";

public void insertIntoTableTOTALCOUNT() {

    SQLiteDatabase db = this.getWritableDatabase();

    db.beginTransaction();

    String select = "Select * from "+ DBContract.DBEntry.TABLE_NAME_TOTALCOUNT;

    Cursor c =db.rawQuery(select, null);
    int cardnum=0;

    try {
        if (c.moveToFirst()) {
            cardnum = c.getInt(1);
            cardnum++;
        }
    } finally {
        if(c !=null && !c.isClosed()){
            c.close();
        }
    }

    ContentValues cv = new ContentValues();
    cv.put(DBContract.DBEntry.COLUMN_NAME_CARDNUM,cardnum);
    db.insert(DBContract.DBEntry.TABLE_NAME_TOTALCOUNT,null,cv);

    db.setTransactionSuccessful();
    db.endTransaction();
    // Close the database.
    if(db.isOpen())
        db.close();
}

...
// Two Tables push the data to a RecyclerView list.
public List<UserData> getDataFromDB(){
    List<UserData> modelList = new ArrayList<>();

    String query = "SELECT *, (SELECT " + DBContract.DBEntry.COLUMN_NAME_CARDNUM +
            " from " + DBContract.DBEntry.TABLE_NAME_TOTALCOUNT +") from "
            + DBContract.DBEntry.TABLE_NAME_USERINPUTS +";";

    SQLiteDatabase db = this.getReadableDatabase();

    db.beginTransaction();

    Cursor cursor = db.rawQuery(query, null);

    Log.d("TAG", DatabaseUtils.dumpCursorToString(cursor));

        try {
            if (cursor.moveToFirst()) {
                do {
                    UserData userData = new UserData();
                    userData.setTodo(cursor.getString(1));
                    userData.setNote1(cursor.getString(2));
                    userData.setNote2(cursor.getString(3));
                    userData.setDuedate(cursor.getString(4));
                    userData.setDuetime(cursor.getString(5));
                    userData.setTimestamp(cursor.getLong(6));
                    userData.setCardnum(cursor.getInt(7));

                    modelList.add(0, userData);
                    } while (cursor.moveToNext());
            }
        } finally {
              if(cursor !=null && !cursor.isClosed()){
              cursor.close();
              }
          }
    db.setTransactionSuccessful();
    db.endTransaction();
    return modelList;
}    

通过在创建表时添加AUTOINCREMENT选项,您可以很容易地做到这一点,它将自动递增

或者顺便说一句,但在处理游标时,您丢失了 这样试试


Android Studio警告说状况c!=null始终为true。它将始终为true,直到最后一行具有表的值,然后moveToNext方法将返回null cursorApp崩溃。使用我上面的方法,错误消息显示CursorIndexOutOfBoundsException:请求索引0,行cardnum=c.getInt1的大小为0;有一个不自动递增的主键值有什么意义?我希望有一列值以+1递增,默认值为0。我是SQLite的新手,所以不确定最好的方法是什么。看一看。谢谢,我会看一看…我很感谢你回来给我更多的建议。我为我的泄气道歉,我不是故意的。我从没想过你真的泄气了。您的设计可能有一些缺陷,但至少现在有两种方法可以自动增加列。
Cursor c =db.rawQuery(select, null);
    int cardnum=0;
c.moveToFirst();
while( c != null )
{
 cardnum = c.getInt(1);
            cardnum++;
c.moveToNext();
}