美文网首页
ManagedSQLiteOpenHelper

ManagedSQLiteOpenHelper

作者: 吃啥呀 | 来源:发表于2018-09-05 22:02 被阅读149次

    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写死

    相关文章

      网友评论

          本文标题:ManagedSQLiteOpenHelper

          本文链接:https://www.haomeiwen.com/subject/fbvzwftx.html