我刚接触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)
我对查询语言不太强,但是我尝试仔细检查查询,但没有发现任何问题。运行更新查询时(无论是上述示例中的哪个版本),所有内容都可以正常运行,但是当我再次重新选择数据时,没有任何改变。数据与我第一次放入时的原始数据相同。
有人可以帮忙吗?
答案 0 :(得分:1)
您的第一个更新代码(两个都正常)没有问题,并且可以正常工作(请参见下面的工作示例)。
我怀疑您的问题可能是您删除了一行并添加了另一行。在这种情况下,因为您已经对AUTOINCREMENT进行了编码,所以该行的ID不会是1,而可能是2。
如果使用工作示例中的代码,那么尝试使用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()方法好像没有关闭数据库。
关闭连接会刷新您所做的更改,否则,引擎会在执行此操作之前等待刷新时间段。使用完毕后关闭连接是一个好主意,以确保您的更改真正进入商店。写入后和刷新前断电将丢失数据。