在 Kotlin 中调用同伴表

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

如何在 Kotlin 中创建各种表

我正在从Java升级到Kotlin,我需要在数据库中创建几个表,首先我创建一个伴随对象并定义表,在DBHelper类中,我创建数据库并尝试调用查询,但它确实不创建任何表。这在 Java 中总是有效,需要了解同伴是如何工作的。我已经是 Kotlin 新手了。

class SpeciesHelper {

    companion object{
        const val TABLE_NAME: String = "species"
        const val COLUMN_ID: String = "id"
        const val COLUMN_NAME: String = "name"
        const val COLUMN_DESC: String = "description"
        const val COLUMN_IMAGE: String = "image"
        const val COLUMN_SKILL: String = "skill"
        const val COLUMN_TYPE: String = "type"
        const val COLUMN_STAR: String = "star"

        val SQL_CREATE_ENTRIES= buildString {
            append("CREATE TABLE $TABLE_NAME (")
            append("$COLUMN_ID INTEGER PRIMARY_KEY,")
            append("$COLUMN_NAME TEXT,")
            append("$COLUMN_DESC TEXT,")
            append("$COLUMN_IMAGE TEXT,")
            append("$COLUMN_SKILL TEXT,")
            append("$COLUMN_TYPE INTEGER,")
            append("$COLUMN_STAR TEXT)")
        }

        val SQL_DELETE_ENTRIES: String = "DROP TABLE IF EXISTS $TABLE_NAME"
    }

}
class DBHelper(context: Context?) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {

    companion object {
        const val DATABASE_NAME: String = "db_species"
        const val DATABASE_VERSION: Int = 1
    }

    override fun onCreate(db: SQLiteDatabase?) {
        db?.execSQL(SpeciesHelper.SQL_CREATE_ENTRIES)
        db?.execSQL(StarsHelper.SQL_CREATE_ENTRIES)
    }

    override fun onUpgrade(db: SQLiteDatabase?, p1: Int, p2: Int) {
        db?.execSQL(SpeciesHelper.SQL_DELETE_ENTRIES);
        db?.execSQL(StarsHelper.SQL_DELETE_ENTRIES);
        onCreate(db)
    }
}
database kotlin sqlite create-table companion-object
1个回答
0
投票

就物种表而言(仅提供的代码),您的代码没问题。

例如使用活动代码:-

class MainActivity : AppCompatActivity() {
    lateinit var dbHelper: DBHelper
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        dbHelper = DBHelper(this)
        val csr =dbHelper.writableDatabase.query("sqlite_master",null,null,null,null,null,null)
        DatabaseUtils.dumpCursor(csr)
    }
}

然后日志显示(模式摘录):-

2024-05-30 13:40:50.807 I/System.out: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@4f2cde9
2024-05-30 13:40:50.808 I/System.out: 0 {
2024-05-30 13:40:50.808 I/System.out:    type=table
2024-05-30 13:40:50.809 I/System.out:    name=android_metadata
2024-05-30 13:40:50.809 I/System.out:    tbl_name=android_metadata
2024-05-30 13:40:50.809 I/System.out:    rootpage=3
2024-05-30 13:40:50.809 I/System.out:    sql=CREATE TABLE android_metadata (locale TEXT)
2024-05-30 13:40:50.809 I/System.out: }
2024-05-30 13:40:50.809 I/System.out: 1 {
2024-05-30 13:40:50.809 I/System.out:    type=table
2024-05-30 13:40:50.809 I/System.out:    name=species
2024-05-30 13:40:50.809 I/System.out:    tbl_name=species
2024-05-30 13:40:50.809 I/System.out:    rootpage=4
2024-05-30 13:40:50.809 I/System.out:    sql=CREATE TABLE species (id INTEGER PRIMARY_KEY,name TEXT,description TEXT,image TEXT,skill TEXT,type INTEGER,star TEXT)
2024-05-30 13:40:50.809 I/System.out: }
2024-05-30 13:40:50.809 I/System.out: <<<<<
  • 由 SQLite API 创建的 android_metadata
  • 已创建物种表

因此,如果该表不存在,而数据库存在,则很可能(并且很常见)存在一个空数据库(无论出于何种原因),或者数据库存在较少的物种表,但存在其他表。

如果数据库存在,则不会调用

onCreate
方法。最简单但会丢失所有数据的规避方法是卸载应用程序。

如果您需要保留数据,那么您应该:-

  1. 增加版本号。
  2. 将代码添加到 onUpdate 方法,以应用所需的架构更改,确保它仅在需要时根据传递给该方法的新旧版本运行
  3. 执行 1 和 2 后重新运行应用程序。

例如(未经测试)大致如下:-

override fun onUpgrade(db: SQLiteDatabase?, p1: Int, p2: Int) {
    //db?.execSQL(SpeciesHelper.SQL_DELETE_ENTRIES);
    //db?.execSQL(StarsHelper.SQL_DELETE_ENTRIES);
    if (p2 <= 2) {
        db?.execSQL(SpeciesHelper.SQL_CREATE_ENTRIES)
    }
    //onCreate(db)
}

您可能希望暂时引入提取和转储模式的活动代码以进行调试。

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