В своем проекте я пытаюсь вставить данные в таблицу 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)
}
Спасибо @MikeT за ваш комментарий, но я тоже пробовал. Это все еще не работает. if (itemquantity.trim (). equals (null)) {cv.put (KEY_QUANTITY, 1)} else {cv.put (KEY_QUANTITY, amount.trim ())}
Я не верю, что он когда-либо будет нулевым, попробуйте проверить длину и включить, только если длина больше нуля (вы можете просто временно удалить cv.put, чтобы показать, что без него оно предоставляет значение по умолчанию).
Я вижу два пробела между: и Hello - моя ценность. «Значение количества: ПРИВЕТ»
Я считаю, что следующее сработает: -
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 один раз (автоматически) за время существования базы данных.
Спасибо @Mike, все заработало после удаления и установки приложения.
Я считаю, что вам не нужно было бы иметь
cv.put(KEY_QUANTITY,quantity.trim()), если бы он не был ценным. Поэтому попробуйте поместить строку в предложение if, чтобы она выполнялась только при наличии значения в количество.