Android SQLITE表未插入默认值

Android SQLITE表未插入默认值,android,android-studio,kotlin,android-sqlite,Android,Android Studio,Kotlin,Android Sqlite,在我的项目中,我试图将数据插入SQLITE表。Insert工作正常,但是如果我没有从活动中传递任何值,那么我可以在表中看到null值,而不是默认值。感谢您的帮助 语言 Kotlin var CREATE_NOTE_TABLE="CREATE TABLE " + TABLE_NAME + "(" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT," + KEY_QUANTITY +

在我的项目中,我试图将数据插入SQLITE表。Insert工作正常,但是如果我没有从活动中传递任何值,那么我可以在表中看到null值,而不是默认值。感谢您的帮助

语言

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)

}
代码

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)

}

我相信以下措施会奏效:-

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)
}
因此,如果修剪()后有一个空字符串,即“”,那么长度将为0,因此将不会执行行
cv.put(KEY\u QUANTITY,QUANTITY.trim())

微妙的区别在于,如果在数量为“”等时使用
cv.put(KEY\u QUANTITY,QUANTITY.trim())
,则底层生成的SQL将包含数量列(KEY\u QUANTITY)并赋值。差不多

INSERT INTO your_table (name,quantity,note,price) VALUES(?,?,?,?);
  • 值将取代?'s
但是,如果没有该行,则插入将是:-

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)

    }
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"
    }
}
DBHelper.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)

    }
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:>>>>>>转储游标android.database.sqlite。SQLiteCursor@268ba35
2019-01-05 13:43:04.4861952-1952/so54048348.kotlinso54048348 I/System.out:0{
2019-01-05 13:43:04.4861952-1952/so54048348.kotlinso54048348 I/System.out:_id=1
2019-01-05 13:43:04.4861952-1952/so54048348.kotlinso54048348 I/System.out:name=Test
2019-01-05 13:43:04.4861952-1952/so54048348.kotlinso54048348 I/System.out:quantity=1
2019-01-05 13:43:04.4861952-1952/so54048348.kotlinso54048348 I/System.out:注释=测试
2019-01-05 13:43:04.4861952-1952/so54048348.kotlinso54048348 I/System.out:price=10.34
2019-01-05 13:43:04.4861952-1952/so54048348.kotlinso54048348 I/System.out:}
2019-01-05 13:43:04.4861952-1952/so54048348.kotlinso54048348 I/System.out:1{
2019-01-05 13:43:04.4861952-1952/so54048348.kotlinso54048348 I/System.out:_id=2
2019-01-05 13:43:04.4861952-1952/so54048348.kotlinso54048348 I/System.out:name=Test2
2019-01-05 13:43:04.4861952-1952/so54048348.kotlinso54048348 I/System.out:quantity=100
2019-01-05 13:43:04.4861952-1952/so54048348.kotlinso54048348 I/System.out:note=test2
2019-01-05 13:43:04.4861952-1952/so54048348.kotlinso54048348 I/System.out:price=34.67
2019-01-05 13:43:04.4861952-1952/so54048348.kotlinso54048348 I/System.out:}

2019-01-05 13:43:04.486 1952-1952/so54048348.kotlinso54048348 I/System.out:如果没有值,我相信您不需要
cv.put(KEY\u QUANTITY,QUANTITY.trim())
。因此,请尝试将该行放在if子句中,以便它仅在数量上有值时运行。感谢@MikeT的评论,但我也尝试过了。它仍然不起作用。如果(itemquantity.trim().equals(null)){cv.put(KEY_QUANTITY,1)}或者{cv.put(KEY_QUANTITY,QUANTITY.trim())}我不相信它会是null,请尝试检查长度,并且仅当长度大于0时才包含。(您可以暂时删除cv.put,以表明如果不删除它,它将提供默认值)。我可以看到:和Hello之间有两个空格。“数量值为:HELLO”@Test自最初运行应用程序以来,您是否更改了表定义?如果是,请尝试删除应用程序的数据或卸载应用程序并重新运行。任何更改都不会应用,因为onCreate方法仅在创建数据库时运行,即在数据库的生命周期内(自动)onCreate一次。谢谢@Mike,它在卸载和安装应用程序后工作正常。