Таблица SQLITE не вставляет значение по умолчанию - PullRequest
0 голосов
/ 05 января 2019

В моем проекте я пытаюсь вставить данные в таблицу 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)

}

1 Ответ

0 голосов
/ 05 января 2019

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

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 INTO your_table (name,note,price) VALUES(?,?,?);

Следовательно, поскольку не делается попытка присвоить значение столбцу количества, для столбца качества будет использоваться значение ПО УМОЛЧАНИЮ.

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

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

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

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: <<<<<
...