ManagedSQLiteOpenHelper

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
idcontent

自己可根据实际需求,增加列数

继承抽象了类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写死

    原文作者:吃啥呀
    原文地址: https://www.jianshu.com/p/9596c6de9fd0
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞