Таблица SQLITE не вставляет значение по умолчанию

В своем проекте я пытаюсь вставить данные в таблицу SQLITE. Вставка работает нормально, но если я не передал никакого значения из своей активности, я могу видеть нулевые значения внутри таблицы вместо значения по умолчанию. Любая помощь приветствуется.

Язык

Kotlin

Код

    var CREATE_NOTE_TABLE = "CREATE TABLE " + TABLE_NAME + "(" + KEY_ID + " INTEGER PRIMARY KEY," +
            KEY_NAME + " TEXT," +
            KEY_QUANTITY + " INTEGER DEFAULT 1," +
            KEY_NOTE + " TEXT DEFAULT GOOD," +
            KEY_PRICE + " DOUBLE" +
            ")"

fun insertData(name: String, quantity: String, note: String, price:Double)
{
    val db=this.writableDatabase
    var cv=ContentValues()

    cv.put(KEY_NAME,name.trim())
    cv.put(KEY_QUANTITY,quantity.trim())
    cv.put(KEY_NOTE,note)
    cv.put(KEY_PRICE,price)

    val result=db.insert(TABLE_NAME,null,cv)

}

Я считаю, что вам не нужно было бы иметь cv.put(KEY_QUANTITY,quantity.trim()), если бы он не был ценным. Поэтому попробуйте поместить строку в предложение if, чтобы она выполнялась только при наличии значения в количество.

MikeT 05.01.2019 02:30

Спасибо @MikeT за ваш комментарий, но я тоже пробовал. Это все еще не работает. if (itemquantity.trim (). equals (null)) {cv.put (KEY_QUANTITY, 1)} else {cv.put (KEY_QUANTITY, amount.trim ())}

user10708780 05.01.2019 02:37

Я не верю, что он когда-либо будет нулевым, попробуйте проверить длину и включить, только если длина больше нуля (вы можете просто временно удалить cv.put, чтобы показать, что без него оно предоставляет значение по умолчанию).

MikeT 05.01.2019 02:41

Я вижу два пробела между: и Hello - моя ценность. «Значение количества: ПРИВЕТ»

user10708780 05.01.2019 02:46
0
4
393
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я считаю, что следующее сработает: -

fun insertData(name: String, quantity: String, note: String, price:Double)
{
    val db=this.writableDatabase
    var cv=ContentValues()

    cv.put(KEY_NAME,name.trim())
    if (quantity.trim().length > 0) {
        cv.put(KEY_QUANTITY,quantity.trim())
    }
    cv.put(KEY_NOTE,note)
    cv.put(KEY_PRICE,price)

    val result=db.insert(TABLE_NAME,null,cv)
}

Таким образом, если после trim () стоит пустая строка, то есть "", то длина будет равна 0, и, следовательно, строка cv.put(KEY_QUANTITY,quantity.trim()) не будет выполняться.

Тонкое различие состоит в том, что если вы использовали cv.put(KEY_QUANTITY,quantity.trim()), когда количество было "" "" и т. д., Тогда базовый сгенерированный SQL включил бы столбец количества (KEY_QUANTITY) и присвоил бы значение. Что-то типа

INSERT INTO your_table (name,quantity,note,price) VALUES(?,?,?,?);
  • Знаки? Будут заменены значениями.

Однако без строки INSERT будет: -

INSERT INTO your_table (name,note,price) VALUES(?,?,?);

Поэтому, поскольку нет попытки присвоить значение столбцу количества, тогда значение DEFAULT будет использоваться для столбца количества.

  • Обратите внимание, что приведенный выше код является принципиальным и не тестировался, поэтому может содержать некоторые ошибки.

Рабочий пример

используя следующий код, приведенное выше работает, как ожидалось: -

MainActivity.kt: -

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var dbhlpr = DBHelper(this);
        dbhlpr.insertData("Test","","test",10.34)
        dbhlpr.insertData("Test2","100","test2", 34.67)
        var csr = dbhlpr.writableDatabase.query(DBHelper.TABLE_NAME, null,null,null,null,null,null)
        DatabaseUtils.dumpCursor(csr)

    }

DBHelper.kt: -

internal class DBHelper(context: Context) :
    SQLiteOpenHelper(context, DBNAME, null, DBVERSION) {

    override fun onCreate(db: SQLiteDatabase) {

        val crt_sql = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "(" +
                KEY_ID + " INTEGER PRIMARY KEY," +
                KEY_NAME + " TEXT," +
                KEY_QUANTITY + " INTEGER DEFAULT 1," +
                KEY_NOTE + " TEXT, " +
                KEY_PRICE + " REAL" +
                ")"
        db.execSQL(crt_sql);

    }

    override fun onUpgrade(db: SQLiteDatabase, i: Int, i1: Int) {

    }

    fun insertData(name: String, quantity: String, note: String, price:Double)
    {
        val db=this.writableDatabase
        var cv= ContentValues()

        cv.put(KEY_NAME,name.trim())
        if (quantity.trim().length > 0) {
            cv.put(KEY_QUANTITY,quantity.trim())
        }
        cv.put(KEY_NOTE,note)
        cv.put(KEY_PRICE,price)

        val result=db.insert(TABLE_NAME,null,cv)
    }

    companion object {

        val DBNAME = "mydb"
        val DBVERSION = 1
        val TABLE_NAME = "mytable"
        val KEY_ID = BaseColumns._ID
        val KEY_NAME = "name"
        val KEY_QUANTITY = "quantity"
        val KEY_NOTE = "note"
        val KEY_PRICE = "price"
    }
}

Результат (первая строка использует значение по умолчанию, вторая - нет)

2019-01-05 13:43:04.486 1952-1952/so54048348.kotlinso54048348 I/System.out: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@268ba35
2019-01-05 13:43:04.486 1952-1952/so54048348.kotlinso54048348 I/System.out: 0 {
2019-01-05 13:43:04.486 1952-1952/so54048348.kotlinso54048348 I/System.out:    _id=1
2019-01-05 13:43:04.486 1952-1952/so54048348.kotlinso54048348 I/System.out:    name=Test
2019-01-05 13:43:04.486 1952-1952/so54048348.kotlinso54048348 I/System.out:    quantity=1
2019-01-05 13:43:04.486 1952-1952/so54048348.kotlinso54048348 I/System.out:    note=test
2019-01-05 13:43:04.486 1952-1952/so54048348.kotlinso54048348 I/System.out:    price=10.34
2019-01-05 13:43:04.486 1952-1952/so54048348.kotlinso54048348 I/System.out: }
2019-01-05 13:43:04.486 1952-1952/so54048348.kotlinso54048348 I/System.out: 1 {
2019-01-05 13:43:04.486 1952-1952/so54048348.kotlinso54048348 I/System.out:    _id=2
2019-01-05 13:43:04.486 1952-1952/so54048348.kotlinso54048348 I/System.out:    name=Test2
2019-01-05 13:43:04.486 1952-1952/so54048348.kotlinso54048348 I/System.out:    quantity=100
2019-01-05 13:43:04.486 1952-1952/so54048348.kotlinso54048348 I/System.out:    note=test2
2019-01-05 13:43:04.486 1952-1952/so54048348.kotlinso54048348 I/System.out:    price=34.67
2019-01-05 13:43:04.486 1952-1952/so54048348.kotlinso54048348 I/System.out: }
2019-01-05 13:43:04.486 1952-1952/so54048348.kotlinso54048348 I/System.out: <<<<<

@Test Изменили ли вы определение таблицы с момента запуска приложения? В таком случае попробуйте удалить данные приложения или удалить приложение и запустить его повторно. Никакие изменения не будут применяться, поскольку метод onCreate запускается только при создании базы данных, то есть onCreate один раз (автоматически) за время существования базы данных.

MikeT 05.01.2019 03:12

Спасибо @Mike, все заработало после удаления и установки приложения.

user10708780 05.01.2019 04:42

Другие вопросы по теме