同时创建两个SQLiteDao对象,其中一个对象在执行Helper时不创建表

问题描述 投票:0回答:1

我有两个表,在打开的应用程序中要检查。

但是当我创建这两个SQLite Dao对象时,总会有一个表无法创建。

这个表是CashPayDao,即使我更改了订单的执行,修改和修改数据库版本号也不会被创建。

当我评论出WXPayDao就能成功创建CashPayDao对应表。

首先,在onCreate中创建两个SQLite Dao对象

    cashDao = CashPayDao(this)
    wxDao = WXPayDao(this)

CashPayDao内容:

class CashPayDao(context: Context) {
    private val payHelper = CashPayDBHelper(context)

CashPayDBHelper内容:

class CashPayDBHelper(context: Context) : SQLiteOpenHelper(context, DB_NAME, null, DB_VERSION) {
    override fun onCreate(db: SQLiteDatabase) {
        db.execSQL(SQLITE_CREATE)
    }

    override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
        db.execSQL(SQLITE_DELETE_ENTRIES)
        onCreate(db)
    }

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

    companion object {
        private val SQLITE_CREATE = "create table if not exists " + CASHPAY_TABLE_NAME + " (" +
                OUT_TRADE_NO + TEXT_TYPE + " PRIMARY KEY, " +
                TEL_SEQ + TEXT_TYPE + COMMA_SEP +
                TOTAL_FEE + DOUBLE_TYPE + COMMA_SEP +
                STORE_ID + TEXT_TYPE + COMMA_SEP +
                ASS_POS + INT_TYPE + COMMA_SEP +
                NEXT_TRANNO + INT_TYPE + COMMA_SEP +
                SEQ + TEXT_TYPE + COMMA_SEP +
                THE_STEP + INT_TYPE + COMMA_SEP +
                ERROR_MESSAGE + TEXT_TYPE + COMMA_SEP +
                IS_DONE + INT_TYPE + DEFAULT + COMMA_SEP +
                IS_UPLOAD + INT_TYPE + DEFAULT + COMMA_SEP +
                UPLOAD_COUNT + INT_TYPE + DEFAULT + COMMA_SEP +
                CREATE_TIME + " DATETIME DEFAULT (datetime(CURRENT_TIMESTAMP,'localtime')))"

        private val SQLITE_DELETE_ENTRIES = "DROP TABLE IF EXISTS " + CASHPAY_TABLE_NAME
    }
}

WXPayDao内容:

class WXPayDao(context: Context) {
    private val payHelper = WXPayDBHelper(context)

WXPayDBHelper内容:

class WXPayDBHelper(context: Context) : SQLiteOpenHelper(context, DB_NAME, null, DB_VERSION) {
    override fun onCreate(db: SQLiteDatabase) {
        db.execSQL(SQLITE_CREATE)
    }

    override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
        db.execSQL(SQLITE_DELETE_ENTRIES)
        onCreate(db)
    }

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

    companion object {
        private val SQLITE_CREATE = "create table if not exists " + WXPAY_TABLE_NAME + " (" +
                OUT_TRADE_NO + TEXT_TYPE + " PRIMARY KEY, " +
                TRANSACTION_ID + TEXT_TYPE + COMMA_SEP +
                TEL_SEQ + TEXT_TYPE + COMMA_SEP +
                TOTAL_FEE + DOUBLE_TYPE + COMMA_SEP +
                STORE_ID + TEXT_TYPE + COMMA_SEP +
                ASS_POS + INT_TYPE + COMMA_SEP +
                NEXT_TRANNO + INT_TYPE + COMMA_SEP +
                SEQ + TEXT_TYPE + COMMA_SEP +
                OPENID + TEXT_TYPE + COMMA_SEP +
                COUPON_FEE + DOUBLE_TYPE + COMMA_SEP +
                THE_STEP + INT_TYPE + COMMA_SEP +
                ERROR_MESSAGE + TEXT_TYPE + COMMA_SEP +
                IS_DONE + INT_TYPE + DEFAULT + COMMA_SEP +
                IS_UPLOAD + INT_TYPE + DEFAULT + COMMA_SEP +
                UPLOAD_COUNT + INT_TYPE + DEFAULT + COMMA_SEP +
                CREATE_TIME + " DATETIME DEFAULT (datetime(CURRENT_TIMESTAMP,'localtime')))"

        private val SQLITE_DELETE_ENTRIES = "DROP TABLE IF EXISTS " + WXPAY_TABLE_NAME
    }
}

我仔细确定了表名不同,一个是cash_pay,一个是wx_pay,数据库是一样的,现在也不明白为什么会这样。

我该怎么办?谢谢! (@•ᴗ•@)


我现在通过在Helper的onCreate和onUpgrade上运行这两个表来解决它。

CashPayDBHelper内容:

override fun onCreate(db: SQLiteDatabase) {
    db.execSQL(SQLITE_CREATE)
    db.execSQL(WXPayDBHelper.SQLITE_CREATE)
}

override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
    db.execSQL(SQLITE_DELETE_ENTRIES)
    db.execSQL(WXPayDBHelper.SQLITE_DELETE_ENTRIES)
    onCreate(db)
}

WXPayDBHelper内容:

override fun onCreate(db: SQLiteDatabase) {
        db.execSQL(SQLITE_CREATE)
        db.execSQL(CashPayDBHelper.SQLITE_CREATE)
    }

override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
        db.execSQL(SQLITE_DELETE_ENTRIES)
        db.execSQL(CashPayDBHelper.SQLITE_DELETE_ENTRIES)
        onCreate(db)
    }

我有一个大胆的想法......

我可能知道原因,但我想我现在需要研究源代码......

android sqlite kotlin
1个回答
1
投票

SQLiteOpenHelper管理数据库文件,而不是单个表。如果同一数据库中有多个表,请将代码放在同一个数据库帮助程序中进行管理。

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