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 ответа:
Хотя мне это кажется странным, потому что значение, которое вы хотите увеличить, равно количеству записей в другой таблице, которые можно получить с помощью простого запроса
"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.