Вставить запись со всеми значениями в качестве автоинкремента или по умолчанию

#android #sqlite #android-sqlite

#Android #sqlite #android-sqlite

Вопрос:

У меня есть таблица с 2 столбцами.

  1. ключ — первичный ключ, автоинкремент
  2. временная метка — DateTime, Default -> CURRENT_TIMESTAMP

Я пытаюсь вставить значение в эту таблицу с помощью объекта SQLiteOpenHelper. Но он выдает исключение:

 public void logTime() {

    SQLiteDatabase db = getWritableDatabase();

    db.insert(TABLE_LOG_TIME, null, new ContentValues());
}
  

Исключение:

 E/SQLiteLog: (1) near "null": syntax error
E/SQLiteDatabase: Error inserting 
      android.database.sqlite.SQLiteException: near "null": syntax error (code 1): , while compiling: INSERT INTO log_time(null) VALUES (NULL)
      at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
      at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:887)
      at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:498)
      at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
      at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
      at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
      at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1469)
      at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1341)
      at com.livinglifetechway.mytime.db.DatabaseHelper.logScreenUnlock(DatabaseHelper.java:62)
      at com.livinglifetechway.mytime.ScreenUnlockBroadcastReceiver.onReceive(ScreenUnlockBroadcastReceiver.java:25)
      at android.app.ActivityThread.handleReceiver(ActivityThread.java:2732)
      at android.app.ActivityThread.access$1800(ActivityThread.java:153)
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1428)
      at android.os.Handler.dispatchMessage(Handler.java:102)
      at android.os.Looper.loop(Looper.java:148)
      at android.app.ActivityThread.main(ActivityThread.java:5441)
      at java.lang.reflect.Method.invoke(Native Method)
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628)
  

Вызов onCreate базы данных:

 @Override
public void onCreate(SQLiteDatabase db) {

    // Create Statements
    String CREATE_TABLE_LOG_TIME = "CREATE TABLE "   TABLE_LOG_TIME   " "  
            "("  
            KEY_LOG_TIME_ID   " INTEGER PRIMARY KEY AUTOINCREMENT, "  
            KEY_LOG_TIME_TIME   " DATETIME DEFAULT CURRENT_TIMESTAMP"  
            ")";

    // Execute statements
    db.execSQL(CREATE_TABLE_LOG_TIME);

}
  

Все значения являются значениями по умолчанию / auto_increment.

Как я могу вставить запись в эту таблицу?

Комментарии:

1. что вы делаете перед db.insert(TABLE_LOG_TIME, null, new ContentValues()); можете ли вы показать?

2. Ваш код реализации базы данных?

3. @Rahul Эти 2 строки находятся внутри простого простого метода.

4. могу ли я увидеть структуру вашей таблицы?

5. @Rahul Я отредактировал вопрос более подробно

Ответ №1:

Чтобы вставить строку со значениями по умолчанию, укажите хотя бы один столбец с нулевым значением:

 ContentValues cv = new ContentValues();
cv.putNull(KEY_LOG_TIME_TIME);
db.insert(TABLE_LOG_TIME, null, cv);
  

Комментарии:

1. Я не знал о putNull

Ответ №2:

замените это

 db.insert(TABLE_LOG_TIME, null, new ContentValues());
  

с

 db.insert(TABLE_LOG_TIME, null, null);