Android SQLITE表未插入默认值
在我的项目中,我试图将数据插入SQLITE表。Insert工作正常,但是如果我没有从活动中传递任何值,那么我可以在表中看到null值,而不是默认值。感谢您的帮助 语言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 +
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(?,?,?);
因此,由于没有尝试为“数量”列指定值,因此“数量”列将使用默认值
- 注:以上为原则代码,未经测试,因此可能包含一些错误
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,它在卸载和安装应用程序后工作正常。