Невозможно получить сохраненные данные из Android SQLite - PullRequest
0 голосов
/ 10 февраля 2019

Я новичок в программировании и начал около месяца.Я создал базу данных для хранения данных карты банкомата и пытаюсь ее восстановить.Однако этого не происходит.

Я вижу, что тостовое сообщение выполняется при сохранении информации о картах - "(Карта добавлена)".Но когда я даже открываю приложение, оно должно получить данные из базы данных.Прямо сейчас он дает 0 в качестве числа.

Я вызываю данные из основного действия.

Я тоже пытался удалить базу данных, очистив данные приложения.

Вот мой MainActivity.

class MainActivity : AppCompatActivity() {

    companion object {
        lateinit var dbHander:DBHandler
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        dbHander=DBHandler(this, null, null, 1)
        viewCards()
        floatingActionButton.setOnClickListener {
        val intent= Intent(this, NewCardRegistration::class.java)
            startActivity(intent)
        }
    }

    fun viewCards() {
        val cardList= dbHander.getCards(this)
        val adapter=Adapters(this, cardList)
        val rv: RecyclerView= rv as RecyclerView
        rv.layoutManager=LinearLayoutManager(this, LinearLayout.VERTICAL, false)
        rv.adapter=adapter
    }

    override fun onResume() {
        viewCards()
        super.onResume()
    }
}

И DBHandler

class DBHandler(context: Context, name:String?, factory: SQLiteDatabase.CursorFactory?, version:Int):
        SQLiteOpenHelper(context, DATABASE_NAME, factory, DATABASE_Version) {


    companion object {

        val DATABASE_NAME = "MyCards.db"
        val DATABASE_Version = 1
        val CARDS_TABLE_NAME = "CARDS"
        val COLUMN_CARD_ID = "CARD_ID"
        val COLUMN_BANK_NAME = "BANK_NAME"
        val COLUMN_CARD_HOLDER_NAME = "NAME"
        val COLUMN_CARD_VALIDITY = "CARD_VALIDITY"

    val COLUMN_CARD_CVV = "CARD_CVV"
        val COLUMN_CARD_NUMBER = "CARD_NUMBER"
        val COLUMN_CUSTOMER_CARE_NUMBER = "CUSTOMER_CARE_NUMBER"

    }

    override fun onCreate(db: SQLiteDatabase?) {
        val CREATE_CARD_TABLE: String = ("CREATE TABLE $CARDS_TABLE_NAME(" +
                "$COLUMN_CARD_ID INTEGER PRIMARY KEY AUTOINCREMENT," +
                "$COLUMN_BANK_NAME," +
                "$COLUMN_CARD_CVV," +
                "$COLUMN_CARD_VALIDITY," +
                "$COLUMN_CARD_NUMBER" +
                "$COLUMN_CUSTOMER_CARE_NUMBER" +
                "$COLUMN_CARD_HOLDER_NAME)")

        db?.execSQL(CREATE_CARD_TABLE)
    }

    override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
    }

    fun getCards(mCtx: Context): ArrayList<Cards> {
        val query = "Select * from $CARDS_TABLE_NAME"
        val db = this.readableDatabase
        val cursor = db.rawQuery(query, null)
        val cardsArray = ArrayList<Cards>()

        if (cursor.count == 0)
            Toast.makeText(mCtx, "No records Found", Toast.LENGTH_LONG).show()
        else {
            while (cursor.moveToNext()) {
                val cards   = Cards()
                cards.cardID = cursor.getInt(cursor.getColumnIndex(COLUMN_CARD_ID))
                cards.bankName = cursor.getString(cursor.getColumnIndex(COLUMN_BANK_NAME))
                cards.cardCVV = cursor.getInt(cursor.getColumnIndex(COLUMN_CARD_CVV))
                cards.cardHolderName = cursor.getString(cursor.getColumnIndex(COLUMN_CARD_HOLDER_NAME))
                cards.validity = cursor.getString(cursor.getColumnIndex(COLUMN_CARD_VALIDITY))
                cards.ccNumber=cursor.getDouble(cursor.getColumnIndex(COLUMN_CUSTOMER_CARE_NUMBER))
                cardsArray.add(cards)
            }
            Toast.makeText(mCtx, "${cursor.count} Records Found", Toast.LENGTH_LONG).show()
        }

        cursor.close()
        db.close()
        return cardsArray
    }

    fun addCard(context: Context, cards: Cards) {
        val values = ContentValues()
        values.put(COLUMN_CARD_VALIDITY, cards.validity)
        values.put(COLUMN_CARD_HOLDER_NAME, cards.cardHolderName)
        values.put(COLUMN_CARD_CVV, cards.cardCVV)
        values.put(COLUMN_BANK_NAME, cards.bankName)
        values.put(COLUMN_CARD_NUMBER, cards.cardNumber)
        values.put(COLUMN_CUSTOMER_CARE_NUMBER, cards.ccNumber)

        val db = this.writableDatabase

        try {
            db.insert(CARDS_TABLE_NAME,null,values)
            Toast.makeText(context, "Card Added", Toast.LENGTH_SHORT).show()
        } catch (e: Exception) {

            Toast.makeText(context, e.message, Toast.LENGTH_SHORT).show()
        }

        db.close()
    }
}

И класс модели для хранения данных.

class Cards {
    var cardID: Int=0
    var bankName: String=""
    var cardHolderName:String=""
    var cardCVV:Int=0
    var validity:String=""
    var cardNumber: Double = 0.0
    var ccNumber:Double=0.0
}

1 Ответ

0 голосов
/ 10 февраля 2019
val CREATE_CARD_TABLE: String = ("CREATE TABLE $CARDS_TABLE_NAME(" +
            "$COLUMN_CARD_ID INTEGER PRIMARY KEY AUTOINCREMENT," +
            "$COLUMN_BANK_NAME," +
            "$COLUMN_CARD_CVV," +
            "$COLUMN_CARD_VALIDITY," +
            "$COLUMN_CARD_NUMBER" +
            "$COLUMN_CUSTOMER_CARE_NUMBER" +
            "$COLUMN_CARD_HOLDER_NAME)")

Вам не хватает нескольких , запятых между столбцами здесь.В результате таблица не содержит столбцов, которые, по вашему мнению, имеют.

try {
    db.insert(CARDS_TABLE_NAME,null,values)
    Toast.makeText(context, "Card Added", Toast.LENGTH_SHORT).show()
} catch (e: Exception) {

    Toast.makeText(context, e.message, Toast.LENGTH_SHORT).show()
}

insert() не выдает ошибку.Он возвращает -1, чтобы указать на ошибку, и если вы используете вместо него insertOrThrow(), вы получите исключение, которое говорит «неизвестный столбец».

Как исправить:

  • Исправьте onCreate() SQL и добавьте пропущенные запятые
  • Измените insert() на insertOrThrow() так, чтобы ваши тосты там работали, как и ожидалось
  • Удалите приложение или очистите данные приложения вудалите старую базу данных и снова запустите onCreate().
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...