kotlin
数据库
anko
cursor
建表
package com.example.lostfond2.search
object HistoryRecordContract {
const val TABLE_NAME = "myTable"//表格名字
const val ID = "_id"//每行一个id,便于后续操作
const val CONTENT = "content"//给自己的某一列数据取名字
}
mytable | ||
---|---|---|
id | content | |
自己可根据实际需求,增加列数
继承抽象了类ManagedSQLiteOpenHelper
package com.example.lostfond2.search
import android.content.Context
import android.database.sqlite.SQLiteDatabase
import org.jetbrains.anko.db.*
class HistoryRecordHelper(val context : Context) : ManagedSQLiteOpenHelper(context,DATABASE_NAME,null,DATABASE_VERSION) {
companion object {
const val DATABASE_VERSION = 1
const val DATABASE_NAME = "HRDataBase"
private var instance : HistoryRecordHelper? = null
@Synchronized
fun getInstance(context: Context) : HistoryRecordHelper{
if(instance == null){
instance = HistoryRecordHelper(context.applicationContext)
}
return instance!!
}
}
override fun onCreate(db: SQLiteDatabase?){
db?.createTable(HistoryRecordContract.TABLE_NAME,true,
Pair(HistoryRecordContract.ID, INTEGER+ PRIMARY_KEY+AUTOINCREMENT),
Pair(HistoryRecordContract.CONTENT, TEXT))
}//有true的话,表已经存在则不再建立
override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
db?.dropTable(HistoryRecordContract.TABLE_NAME,true)
onCreate(db)
}
}
val Context.database: HistoryRecordHelper
get() = HistoryRecordHelper.getInstance(applicationContext)//为上下文创建一个扩展属性,这样任何需要Context的类都可以直接访问数据库。
在Activity里的使用
package com.example.lostfond2.search
class SearchActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
database.use {
createTable(HistoryRecordContract.TABLE_NAME,true,
Pair(HistoryRecordContract.ID, INTEGER + PRIMARY_KEY + AUTOINCREMENT),
Pair(HistoryRecordContract.CONTENT, TEXT))
}
val db = database.writableDatabase
}
}
private fun database(query:String,db:SQLiteDatabase){
//对搜索历史的数据库处理
val cursor = db.query("myTable", null,null,null,null,null,null)//cursor为游标
if (cursor!= null){
while (cursor.moveToNext()){
val number = cursor.getColumnIndex("content")
if(cursor.getString(number) == query){
db.delete("myTable","content=?", arrayOf(query))
}
}
}
val values = ContentValues()
values.put("content",query)
//times为存入的数据条数
db.insert("myTable",null ,values) //插入数据
val times = cursor.count
if(times>5){
//超过5条,则删掉最后一条
cursor.moveToFirst()
val timeOfID = cursor.getColumnIndex("_id")
var minID = cursor.getInt(timeOfID)
db.delete("myTable","_id = {userID}", "userID" to minID)//arrayOf(min.toString()))
}
}
error1
找不”_id”
solution1
需要加入参数
AUTOINCREMENT
,将ID设置为自增id,也就是不用自己存id数据,会自动为你新加的一行附加id,并且该ID值比原有ID值的最大值大1
error2
执行delete语句代码一直崩, can not find column
solution2
ManagedSQLiteOpenHelper() 里的 onCreate方法由于设置的是true,如果表已经存在,则不再建表,故onCreate只
执行一次
但是刚开始我的表里面没有_id
,后来加的,所以我的表自然也没有”_id”这一列,把数据清除后,重新建数据库
,表也就重新create了
error3
执行delete的时候一直抛数据库异常
solution3
把
表名
和数据库
名混在一起了,应为tablename
error4
第二次搜索代码崩溃
solution4
我在处理完数据库之后,就db.close(),将数据库关掉了,但是这个数据库我也并没有明确打开过,第二次搜索,还要继续使用,当然崩了,所以
不用关闭数据库
error5
在执行if(){}的时候抛溢出异常
solution5
本来我统计表的行数是:val times = db.insert(“myTable”,null ,values) ,但是我后来发现times是第几次插入数据,但是我想要的是当前表中的行数,如果删过行数,times就会大于当前表中的行数,而
cursor.count
统计的则是表格中存在的行数
error6
cursor.getString(number) == query本来我写的是cursor.getString(1) == query,觉得“content”是第二列,所以是index是1,还有var minID = cursor.getInt(timeOfID)本来写的也是var minID = cursor.getInt(0),因为“_id”是第一列,本来一直都没问题,某一天突然就抛溢出异常
solution
后来debug查出来,“_id”对应的index是-1,“content”对应的index是“0”,所以就没有把index写死