Android: Как увеличить столбец SQLite INTEGER PRIMARY KEY AUTOINCREMENT?


В моей деятельности у меня есть кнопка Save, которая при нажатии сохранит кучу пользовательских входных данных в таблицу SQLite. В тот же щелчок Я хочу также увеличить счетчик целых чисел в другой таблице. Счетчик настроен как "cardnum".

Чего мне здесь не хватает?

Файл активности:

...
public void onClickSave(View v) {

    helper = new DatabaseHelper(CardViewActivity.this);
    helper.insertIntoTableTOTALCOUNT();
    ...
    startActivity(new Intent(CardViewActivity.this,ListActivity.class));
}     

DBContract.java

public final class DBContract {
    public DBContract() {}

    public static abstract class DBEntry implements BaseColumns {

        // Strings for USERINPUTS TABLE
        public static final String TABLE_NAME_USERINPUTS = "userinputs";
        public static final String COLUMN_NAME_ID = "_id";
        public static final String COLUMN_NAME_TODO = "todo";
        public static final String COLUMN_NAME_NOTE1 = "note1";
        public static final String COLUMN_NAME_NOTE2 = "note2";
        public static final String COLUMN_NAME_DUEDATE = "duedate";
        public static final String COLUMN_NAME_DUETIME = "duetime";
        public static final String COLUMN_NAME_TIMESTAMP = "timestamp";

        // Strings for COUNT TABLE
        public static final String TABLE_NAME_TOTALCOUNT = "totalcount";
        public static final String COLUMN_NAME_COUNTID = "count_id";
        public static final String COLUMN_NAME_CARDNUM = "cardnum";
    }
}

Файл DBHelper:

...
@Override
public void onCreate(SQLiteDatabase db) {
    // Set up the Column headings in USERINPUTS TABLE
    db.execSQL(SQL_CREATE_ENTRIES);
    // Set up the Column headings in TOTALCOUNT TABLE
    db.execSQL(SQL_CREATE_COUNTER);
    // Put a default zero value in the CARDNUM counter to get started.
    db.execSQL("INSERT INTO " + DBContract.DBEntry.TABLE_NAME_TOTALCOUNT +
          "(count_id," + DBContract.DBEntry.COLUMN_NAME_CARDNUM+") VALUES (1,0)");
}

private static final String SQL_CREATE_ENTRIES =
        "CREATE TABLE IF NOT EXISTS " + DBContract.DBEntry.TABLE_NAME_USERINPUTS +
            "(" + DBContract.DBEntry.COLUMN_NAME_ID +
                  " INTEGER PRIMARY KEY,"
                + DBContract.DBEntry.COLUMN_NAME_TODO +
                  " TEXT,"
                + DBContract.DBEntry.COLUMN_NAME_NOTE1 +
                  " TEXT,"
                + DBContract.DBEntry.COLUMN_NAME_NOTE2 +
                  " TEXT,"
                + DBContract.DBEntry.COLUMN_NAME_DUEDATE +
                  " TEXT,"
                + DBContract.DBEntry.COLUMN_NAME_DUETIME +
                  " TEXT,"
                + DBContract.DBEntry.COLUMN_NAME_TIMESTAMP +
                  " INTEGER" + ")";

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

    public void insertIntoTableTOTALCOUNT() {

    SQLiteDatabase db = this.getWritableDatabase();

    db.beginTransaction();

    db.execSQL(INCREMENT_COUNT1);
    db.execSQL(INCREMENT_COUNT2);

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

public static final String INCREMENT_COUNT1 = "INSERT OR IGNORE INTO "+ DBContract.DBEntry.TABLE_NAME_TOTALCOUNT+
        " (count_id,"+DBContract.DBEntry.COLUMN_NAME_CARDNUM+") VALUES (1,0)";
public static final String INCREMENT_COUNT2 = "UPDATE " + DBContract.DBEntry.TABLE_NAME_TOTALCOUNT+" SET "+ DBContract.DBEntry.COLUMN_NAME_CARDNUM + "="+ DBContract.DBEntry.COLUMN_NAME_CARDNUM+"+1";
2 2

2 ответа:

Хотя мне это кажется странным, потому что значение, которое вы хотите увеличить, равно количеству записей в другой таблице, которые можно получить с помощью простого запроса "COUNT", но здесь вы можете достичь этого:

Сначала измените описание таблицы подсчета на:

    "CREATE TABLE IF NOT EXISTS " + DBContract.DBEntry.TABLE_NAME_COUNT +
        "(_id INTEGER UNIQUE, " + DBContract.DBEntry.COLUMN_NAME_CARDNUM +
              " INTEGER" + ")"

В вашем onCreate в SqliteOpenHelper инициализируйте счетчик до 0:

db.execSQL("INSERT INTO "+ DBContract.DBEntry.TABLE_NAME_COUNT + 
           "(_id," + DBContract.DBEntry.COLUMN_NAME_CARDNUM+") VALUES (1,0)");

Добавьте последнюю строку в свой класс:

public static final String INCREMENT_COUNT1 = "INSERT OR IGNORE INTO "+ DBContract.DBEntry.TABLE_NAME_COUNT+
" (_id,"+DBContract.DBEntry.COLUMN_NAME_CARDNUM+") VALUES (1,0)";
public static final String INCREMENT_COUNT2 = "UPDATE " + DBContract.DBEntry.TABLE_NAME_COUNT+" SET "+ DBContract.DBEntry.COLUMN_NAME_CARDNUM + "=" + DBContract.DBEntry.COLUMN_NAME_CARDNUM+"+1";

Измените следующую функцию:

public void insertIntoTableCount() {

    SQLiteDatabase db = this.getWritableDatabase();
    db.execSQL(INCREMENT_COUNT1);
    db.execSQL(INCREMENT_COUNT2);
    db.close();
}

В вашем onClickSave Сделайте следующее:

helper = new DatabaseHelper(CardViewActivity.this);

//for extra caution it is better to add beginTransaction here
helper.insertIntoTableUserInputs(todo,note1,note2,duedate,duetime,timestamp);
helper.insertIntoTableCount();
//add setTransactionSuccessfull() and endTransaction here

Я думаю , что это не имеет смысла, таблицу с одним столбцом и определить как первичный ключ.

Если у вас есть таблица с первичным ключом : например, имя таблицы Student и столбцы studentid, studenName. studentid объявлен как первичный ключ и автоинкремент, то вам нужно только вставить запись в столбец studentName следующим образом:

SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values2 = new ContentValues();
    values2.put("studentName", studentName);

    db.insert("Student", null, values2);

Внутренне этот запрос будет

INSERT INTO Student (studentid,studenName)
VALUES (null,studentname);

Первичный ключ и автоматически увеличенное значение передаются как null, чтобы механизм sqlite определил, что это является автоинкрементным значением столбца и строки, автоматически увеличенным на 1.