Сбой базы данных SQLite при чтении - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь создать приложение для сбора монет евро, но моя программа не может получить доступ к базе данных, она каждый раз вылетала при попадании в строку попадания 'val db = readableDatabase', она работала, а затем я что-то менял и пытался вернуть его обратно, но он больше не работает, установить приложение удаления не работает в других приложениях, этот код выполняется, но у меня есть еще одно приложение, где этот код успешно выполняется, а затем я добавляю еще одну таблицу, и там у меня та же проблема. Поэтому я подумал, что установка приложения удаления может решить эту проблему, как сброс базы данных. Спасибо за помощь.

class DatabaseHelper(context: Context): SQLiteOpenHelper(context,
    DATABASE_NAME, null, 1) {
    override fun onCreate(db: SQLiteDatabase?) {
        val sqlCreateTable = "CREATE TABLE $TABLE_NAME ($ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
                "$COUNTRY_CODE TEXT NOT NULL, " +
                "$COIN_VALUE INTEGER NOT NULL, " +
                "$OWNERSHIP INTEGER NOT NULL, " +
                "$QUALITY INTEGER NOT NULL)"
        db!!.execSQL(sqlCreateTable)
        fillTable()
    }

    override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
        db!!.execSQL("DROP TABLE IF EXISTS $TABLE_NAME")
        onCreate(db)
    }

    private val listOfCodes = arrayOf(
        "AD", "BE", "CY", "DE",
        "EE", "FI", "FR", "GR",
        "NE", "IE", "LT", "LV",
        "LU", "MT", "MO", "PT",
        "AT", "SM", "SK", "SI",
        "ES", "IT", "VA")

    private fun fillTable(){...addingCoins...}
    // Like 
    //     insertData(listOfCodes[0], 1)
    //     insertData(listOfCodes[0], 2)
    //     insertData(listOfCodes[0], 5) etc.

    private fun insertData(code: String, coinValue: Int){
        val db = this.writableDatabase

        val cv = ContentValues()
        cv.put(COUNTRY_CODE, code)
        cv.put(COIN_VALUE, coinValue)
        cv.put(OWNERSHIP, 0)
        cv.put(QUALITY, 0)
        db.insert(TABLE_NAME, null, cv)
    }

    fun updateOwnership(coinId: Int, newOwnership: Int){
        val db = writableDatabase

        val cv = ContentValues()
        cv.put(OWNERSHIP, newOwnership)
        db.update(TABLE_NAME, cv, "$ID = $coinId", null)
    }

    fun updateQuality(coinId: Int, newQuality: Int){
        val db = writableDatabase

        val cv = ContentValues()
        cv.put(QUALITY, newQuality)
        db.update(TABLE_NAME, cv, "$ID = $coinId", null)
    }

    fun getAllCoins(countryCode: String):ArrayList<Coins>{
        val coinsList = ArrayList<Coins>()
        val db = readableDatabase

        val selectionArgs = arrayOf(countryCode)
        val c: Cursor = db.rawQuery("SELECT * FROM $TABLE_NAME WHERE $COUNTRY_CODE = ? ORDER BY $COIN_VALUE", selectionArgs)

        if (c.moveToFirst()){
            do {
                val coinItem = Coins(
                    id = c.getInt(c.getColumnIndex(ID)),
                    country_code = c.getString(c.getColumnIndex(COUNTRY_CODE)),
                    coin_value = c.getInt(c.getColumnIndex(COIN_VALUE)),
                    ownership = c.getInt(c.getColumnIndex(OWNERSHIP)) == 1,
                    quality = c.getInt(c.getColumnIndex(QUALITY))
                )
                coinsList.add(coinItem)
            }while (c.moveToNext())
        }
        c.close()

        return coinsList
    }

    companion object{
        const val DATABASE_NAME = "Coins.db"
        const val TABLE_NAME = "coins_table"
        const val ID = "id"
        const val COUNTRY_CODE = "country_code"
        const val COIN_VALUE = "coin_value"
        const val OWNERSHIP = "ownership"
        const val QUALITY = "quality"
    }
}

1 Ответ

0 голосов
/ 30 апреля 2020

Вы звоните get...Database() рекурсивно.

Ваш звонок на getReadableDatabase() вызывает onCreate(), который вызывает fillTable(), который вызывает insertData(), который вызывает getWritableDatabase().

Вы не можете позвонить get...Database(), пока onCreate() выполняется. Вместо этого используйте SQLiteDatabase, передаваемый в качестве аргумента onCreate().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...