SQLite数据库从Android模拟器中消失了

问题描述 投票:-3回答:1

我正在使用Android Studio 3.0.1并使用Android模拟器来查看应用程序的运行方式。我的应用程序有SQLite数据库但是在更新Android Studio之后,或者它的组件模拟器启动时显示消息“执行干净启动快照不存在”。我的数据库从应用程序中消失了这是在Android模拟器上擦拭还是我在数据库编程中犯了一些错误?这种麻烦会在真实设备上发生吗?

import android.content.ContentValues
import android.content.Context
import android.database.Cursor
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
import android.database.sqlite.SQLiteQueryBuilder
import android.widget.Toast
import android.database.SQLException
import kotlin.collections.ArrayList


class DbManagerVol {
    var dbName=Const.DB_NAME
    var dbTable:String? = null
    val dbVersion = 2
    var sqlCreateTable:String? = null 
    var sqlDB:SQLiteDatabase? = null

    constructor (context: Context, dbTable:String?, sqlCreateTable:String?) {
        this.sqlCreateTable = sqlCreateTable
        this.dbTable = dbTable
        val db = DataBaseHelperVol(context)
        sqlDB=db.writableDatabase
        if(sqlCreateTable!=null)sqlDB!!.execSQL(sqlCreateTable)
    }

    inner class DataBaseHelperVol:SQLiteOpenHelper {
        var context:Context?=null
        constructor(context: Context):super(context,dbName,null,dbVersion){
            this.context=context
        }
        override fun onCreate(db: SQLiteDatabase?) {

            db!!.execSQL(sqlCreateTable)
            Toast.makeText(this.context, "database $dbName is created", Toast.LENGTH_LONG).show()
        }

        override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
            db!!.execSQL("Drop table IF EXISTS $dbTable")
        }

    }
    fun dbInsert(values:ContentValues):Long{
        val ID = sqlDB!!.insert(dbTable, "", values)
        return ID
    }

    fun dbQuerry(projection: Array<String>, selection:String, selectionArgs:Array<String>, sortOrder:String):Cursor?{
        val qb = SQLiteQueryBuilder()
        qb.tables=dbTable
        var cursor:Cursor? = null
        try {
            cursor = qb.query(sqlDB, projection, selection, selectionArgs, null, null, sortOrder)
        }catch (e:Exception){}
        return cursor!!


    }
    fun dbQuerryArray(projection: Array<String>, selection:String, selectionArgs:Array<String>, sortOrder:String,
                      spUndefined:String, spAdd:String, spDelete:String):ArrayList<String>{
        val listSpinner:ArrayList<String>? = ArrayList<String>()
        val qb = SQLiteQueryBuilder()
        qb.tables=dbTable

        try {
            val cursor:Cursor? = qb.query(sqlDB, projection, selection, selectionArgs, null, null, sortOrder)
            if (cursor!!.moveToFirst()) {
                do {
                    val str = cursor.getString(cursor.getColumnIndex(sortOrder))
                    listSpinner!!.add(str)

                } while (cursor.moveToNext())
            }
            listSpinner!!.add(spUndefined)
            listSpinner.add(spAdd)
            listSpinner.add(spDelete)

        } catch (e:SQLException) {
            listSpinner!!.add(spUndefined)
            listSpinner.add(spAdd)
            listSpinner.add(spDelete)
        }

        return listSpinner!!
    }

    fun dbRowDelete(colName:String, value:String):Int {
        sqlDB!!.execSQL(sqlCreateTable)
        val str2 = "$colName='$value'"
        return sqlDB!!.delete(dbTable, str2, null)
    }

    fun dbLastRowInt(dbTable:String, column:String):Int {
        val selectQuery= "SELECT * FROM $dbTable ORDER BY $column DESC LIMIT 1"
        val cursor = sqlDB!!.rawQuery(selectQuery, null)
        var a = 0
        if(cursor.moveToFirst())
            a  =  cursor.getInt( cursor.getColumnIndex(column) )
        cursor.close()
        return a


    }

    fun dbUpdateRow (table:String, values: ContentValues, colName:String, value:Int):Int {
        return sqlDB!!.update(table, values, "$colName = $value", null)
    }

    fun dbDelTable () {
        sqlDB!!.execSQL("Drop table IF EXISTS $dbTable")
    }

    fun dbRowsDelete(colName:String, values:Array<String>):Int {
        sqlDB!!.execSQL(sqlCreateTable)
        val placeholders = StringBuilder()
        for (i in 0 until values.size) {
            if (i != 0)
                placeholders.append(", ")

            placeholders.append("?")
        }

        val where = "$colName IN (" + placeholders.toString() + ")"
        return sqlDB!!.delete(dbTable, where, values)
    }

    fun countTables () :ArrayList<String>{
        val array = ArrayList<String>()
        val c = sqlDB!!.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null) 
        if (c.moveToFirst()) {
            while ( !c.isAfterLast) {
                array.add( c.getString( c.getColumnIndex("name")) )
                c.moveToNext()
            }
        }
        return array
    }

}
android sqlite android-emulator kotlin
1个回答
0
投票

你的onUpgradeDataBaseHelperVol方法只包含丢弃指令。这意味着数据库的第一个版本更新只会清理数据。可能你需要再次执行你的sqlCreateTable指令,但我不知道你想要什么。

猜猜你不懂SQLite数据库生命周期。 Try to read that

© www.soinside.com 2019 - 2024. All rights reserved.