SQLLite更新根本不会更新表(带有Kotlin的Android Studio)

时间:2019-05-17 04:16:17

标签: android sqlite kotlin sql-update android-sqlite

我刚接触Android,Kotlin和SQLLite。

我创建了这个表。

val create = "CREATE TABLE IF NOT EXISTS $TABLE_NAME (" +
    "$COLUMN_ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
    "$COLUMN_USERNAME STRING, $COLUMN_PASSWORD STRING, $COLUMN_EMAIL STRING, $COLUMN_LAST_LOGIN DATETIME NULL, " +
    "$COLUMN_PRIV_ACCESS_ADMIN_LIST BOOLEAN, $COLUMN_PRIV_CHANGE_ADMIN_LIST BOOLEAN, $COLUMN_PRIV_SEND_EMAIL_REPORT BOOLEAN, " +
    "$COLUMN_IS_ACTIVE BOOLEAN" +
    ")"
db.execSQL(create)

我可以成功添加新数据:

val values = ContentValues()

values.put(COLUMN_USERNAME, "admin")
values.put(COLUMN_PASSWORD, "password")
values.put(COLUMN_EMAIL, "test@test.com")
values.put(COLUMN_PRIV_ACCESS_ADMIN_LIST, true)
values.put(COLUMN_PRIV_CHANGE_ADMIN_LIST, true)
values.put(COLUMN_PRIV_SEND_EMAIL_REPORT, true)
values.put(COLUMN_IS_ACTIVE, admin.isActive)

val db = this.writableDatabase
db.insert(TABLE_NAME, null, values)

我还可以使用以下方法成功检索数据:

val db = this.readableDatabase
val cursor = db.rawQuery("SELECT * FROM $TABLE_NAME", null)

据此我得到的信息是我放入的数据的ID = 1

但是我无法使用以下代码将数据更改为其他内容:

val values = ContentValues()

values.put(COLUMN_USERNAME, "adminssss")
values.put(COLUMN_PASSWORD, "passwordsss")
values.put(COLUMN_EMAIL, "test@test.org")
values.put(COLUMN_PRIV_ACCESS_ADMIN_LIST, false)
values.put(COLUMN_PRIV_CHANGE_ADMIN_LIST, true)
values.put(COLUMN_PRIV_SEND_EMAIL_REPORT, false)
values.put(COLUMN_IS_ACTIVE, true)

val db = this.writableDatabase
db.update(TABLE_NAME, values, "$COLUMN_ID=1", arrayOf())
// or
db.update(TABLE_NAME, values, "$COLUMN_ID=?", arrayOf("1"))

val db = this.writableDatabase
val query = "UPDATE $TABLE_NAME " +
    "SET $COLUMN_USERNAME = 'adminssss', $COLUMN_PASSWORD = 'passwordsss', $COLUMN_EMAIL = 'test@test.org', " +
    "$COLUMN_PRIV_ACCESS_ADMIN_LIST = 0, " +
    "$COLUMN_PRIV_CHANGE_ADMIN_LIST = 1, " +
    "$COLUMN_PRIV_SEND_EMAIL_REPORT = 0, " +
    "$COLUMN_IS_ACTIVE = 1 " +
    "WHERE $COLUMN_ID = 1"
db.rawQuery(query, null)
// or
db.execQuery(query)

我对查询语言不太强,但是我尝试仔细检查查询,但没有发现任何问题。运行更新查询时(无论是上述示例中的哪个版本),所有内容都可以正常运行,但是当我再次重新选择数据时,没有任何改变。数据与我第一次放入时的原始数据相同。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

您的第一个更新代码(两个都正常)没有问题,并且可以正常工作(请参见下面的工作示例)。

我怀疑您的问题可能是您删除了一行并添加了另一行。在这种情况下,因为您已经对AUTOINCREMENT进行了编码,所以该行的ID不会是1,而可能是2。

  • 您可以使用logAll函数(在下面的工作示例中使用)来检查基础行。

如果使用工作示例中的代码,那么尝试使用rawQuery和execQuery的问题就没有意义了。

我相信您的问题是您如何查看结果(或如前所述)。考虑以下工作示例:-

工作示例

Database Helper类 DBHelper.kt (基于可用的代码),包括代码,例如更新为功能:-

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

    val all: Cursor
        get() = this.writableDatabase.query(TABLE_NAME, null, null, null, null, null, null)

    override fun onCreate(db: SQLiteDatabase) {

        db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "(" +
                COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                COLUMN_USERNAME + " STRING, " +
                COLUMN_PASSWORD + " STRING, " +
                COLUMN_EMAIL + " STRING, " +
                COLUMN_LAST_LOGIN + " DATETIME DEFAULT NULL, " +
                COLUMN_PRIV_ACCESS_ADMIN_LIST + " BOOLEAN, " +
                COLUMN_PRIV_CHANGE_ADMIN_LIST + " BOOLEAN," +
                COLUMN_PRIV_SEND_EMAIL_REPORT + " BOOLEAN, " +
                COLUMN_IS_ACTIVE + " BOOLEAN" +
                ")"
        )
    }

    fun add(
            username: String,
            password: String,
            email: String,
            privaccessadminlist: Boolean,
            privchangeadminlist: Boolean,
            privsendemailreport: Boolean,
            is_active: Boolean): Long {

        val cv = ContentValues()
        cv.put(COLUMN_USERNAME, username)
        cv.put(COLUMN_PASSWORD, password)
        cv.put(COLUMN_EMAIL, email)
        cv.put(COLUMN_PRIV_ACCESS_ADMIN_LIST, privaccessadminlist)
        cv.put(COLUMN_PRIV_CHANGE_ADMIN_LIST, privchangeadminlist)
        cv.put(COLUMN_PRIV_SEND_EMAIL_REPORT, privsendemailreport)
        return this.writableDatabase.insert(TABLE_NAME, null, cv)
    }

    fun logAll() {
        val csr = all
        var sb = StringBuilder()
        while (csr.moveToNext()) {
            sb = StringBuilder().append("Row is " + csr.position.toString())
            sb.append("\n\tUserName is :").append(csr.getString(csr.getColumnIndex(COLUMN_USERNAME)))
            sb.append("\n\tPasword is :").append(csr.getString(csr.getColumnIndex(COLUMN_PASSWORD)))
            sb.append("\n\tEmail is :").append(csr.getString(csr.getColumnIndex(COLUMN_EMAIL)))
            sb.append("\n\t PRIVACCESSAL is ").append((csr.getInt(csr.getColumnIndex(COLUMN_PRIV_ACCESS_ADMIN_LIST)) > 0).toString())
            sb.append("\n\t PRIVCHGAL is ").append((csr.getInt(csr.getColumnIndex(COLUMN_PRIV_CHANGE_ADMIN_LIST)) > 0).toString())
            sb.append("\n\t PRIVSNDEMAIL is ").append((csr.getInt(csr.getColumnIndex(COLUMN_PRIV_SEND_EMAIL_REPORT)) > 0).toString())
            Log.d("LOGDATA", sb.toString())
        }
    }

    // Suggested update code
    fun updateById(id: Long,
                   username: String,
                   password: String,
                   email: String,
                   privaccessadminlist: Boolean,
                   privchangeadminlist: Boolean,
                   privsendemailreport: Boolean,
                   is_active: Boolean): Int {
        val cv = ContentValues()
        cv.put(COLUMN_USERNAME, username)
        cv.put(COLUMN_PASSWORD, password)
        cv.put(COLUMN_EMAIL, email)
        cv.put(COLUMN_PRIV_ACCESS_ADMIN_LIST, privaccessadminlist)
        cv.put(COLUMN_PRIV_CHANGE_ADMIN_LIST, privchangeadminlist)
        cv.put(COLUMN_PRIV_SEND_EMAIL_REPORT, privsendemailreport)
        val whereclause = "$COLUMN_ID=?"
        val whereargs = arrayOf(id.toString())
        return this.writableDatabase.update(TABLE_NAME, cv, whereclause, whereargs)
    }

    //Your code
    fun update() {
        val values = ContentValues()

        values.put(COLUMN_USERNAME, "adminszzz")
        values.put(COLUMN_PASSWORD, "passwordzzz")
        values.put(COLUMN_EMAIL, "test@test.orgzzz")
        values.put(COLUMN_PRIV_ACCESS_ADMIN_LIST, false)
        values.put(COLUMN_PRIV_CHANGE_ADMIN_LIST, true)
        values.put(COLUMN_PRIV_SEND_EMAIL_REPORT, false)
        values.put(COLUMN_IS_ACTIVE, true)

        val db = this.writableDatabase
        db.update(TABLE_NAME, values, "$COLUMN_ID=1", arrayOf())
// or
        //db.update(TABLE_NAME, values, "$COLUMN_ID=?", arrayOf("1"))
    }


    override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
    }

    companion object {

        val DBNAME = "mydb"
        val DBVERSION = 1

        val TABLE_NAME = "mytable"
        val COLUMN_ID = BaseColumns._ID
        val COLUMN_USERNAME = "username"
        val COLUMN_PASSWORD = "password"
        val COLUMN_EMAIL = "email"
        val COLUMN_LAST_LOGIN = "last_login"
        val COLUMN_PRIV_ACCESS_ADMIN_LIST = "priv_access_admin_list"
        val COLUMN_PRIV_CHANGE_ADMIN_LIST = "priv_change_admin_list"
        val COLUMN_PRIV_SEND_EMAIL_REPORT = "priv_send_email_report"
        val COLUMN_IS_ACTIVE = "is_active"
    }
}

和一个用于调用功能 MainAvctivity.kt 的活动:-

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        var dbhlpr = DBHelper(this)

        dbhlpr = DBHelper(this)
        dbhlpr.add("admin", "password", "test@test.com", true, true, true, true)
        dbhlpr.logAll()

        dbhlpr.updateById(1, "adminssss", "passwordsss", "test@test.org", false, true, false, true)
        dbhlpr.logAll()

        dbhlpr.update();
        dbhlpr.logAll();
    }
}

结果

运行时,以下内容输出到日志:-

2019-05-17 16:12:07.182 18164-18164/aso.so56179532update D/LOGDATA: Row is 0
        UserName is :admin
        Pasword is :password
        Email is :test@test.com
         PRIVACCESSAL is true
         PRIVCHGAL is true
         PRIVSNDEMAIL is true
2019-05-17 16:12:07.184 18164-18164/aso.so56179532update D/LOGDATA: Row is 0
        UserName is :adminssss
        Pasword is :passwordsss
        Email is :test@test.org
         PRIVACCESSAL is false
         PRIVCHGAL is true
         PRIVSNDEMAIL is false
2019-05-17 16:12:07.186 18164-18164/aso.so56179532update D/LOGDATA: Row is 0
        UserName is :adminszzz
        Pasword is :passwordzzz
        Email is :test@test.orgzzz
         PRIVACCESSAL is false
         PRIVCHGAL is true
         PRIVSNDEMAIL is false

即有3个批次,每个批次显示数据库中的单行。后两个表明数据已相应更新。

答案 1 :(得分:0)

更新操作后调用db.close()方法好像没有关闭数据库。

关闭连接会刷新您所做的更改,否则,引擎会在执行此操作之前等待刷新时间段。使用完毕后关闭连接是一个好主意,以确保您的更改真正进入商店。写入后和刷新前断电将丢失数据。