如何在 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)
}
}
就物种表而言(仅提供的代码),您的代码没问题。
例如使用活动代码:-
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: <<<<<
因此,如果该表不存在,而数据库存在,则很可能(并且很常见)存在一个空数据库(无论出于何种原因),或者数据库存在较少的物种表,但存在其他表。
如果数据库存在,则不会调用
onCreate
方法。最简单但会丢失所有数据的规避方法是卸载应用程序。
如果您需要保留数据,那么您应该:-
例如(未经测试)大致如下:-
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)
}
您可能希望暂时引入提取和转储模式的活动代码以进行调试。