我正试图在Android Studio中创建基于BoardGameGeek API的应用程序,然而由于未知的原因,我的数据库创建时没有列.以下是逻辑日志(log):
(1) no such table: games in "INSERT INTO games(release_year,bgg_id,game_title,thumbnail,original_title) VALUES (?,?,?,?,?)"
实现数据库+插入方法的类:
class DatabaseInit(context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {
companion object {
val DATABASE_VERSION = 2
val DATABASE_NAME = "boardgames.db"
// Tabela z informacjami o grach
val TABLE_GAMES = "games"
val COLUMN_GAME_TITLE = "game_title"
val COLUMN_ORIGINAL_TITLE = "original_title"
val COLUMN_RELEASE_YEAR = "release_year"
val COLUMN_BGG_ID = "bgg_id"
val COLUMN_TYPE = "type"
val COLUMN_THUMBNAIL = "thumbnail"
}
override fun onCreate(db: SQLiteDatabase) {
db.execSQL("DROP TABLE IF EXISTS `$TABLE_GAMES`")
val CREATE_TABLE_GAMES = "CREATE TABLE $TABLE_GAMES(" +
"$COLUMN_GAME_TITLE TEXT," +
"$COLUMN_ORIGINAL_TITLE TEXT," +
"$COLUMN_RELEASE_YEAR INTEGER," +
"$COLUMN_BGG_ID INTEGER PRIMARY KEY," +
"$COLUMN_TYPE INTEGER," +
"$COLUMN_THUMBNAIL BLOB)"
db.execSQL(CREATE_TABLE_GAMES)
}
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
db.execSQL("DROP TABLE IF EXISTS $TABLE_GAMES")
onCreate(db)
}
fun addDataFromXml(context: Context) {
val xmlFile = File(context.filesDir, "XML/dane.xml")
val xmlInputStream = FileInputStream(xmlFile)
val xmlParser = Xml.newPullParser()
xmlParser.setInput(xmlInputStream, null)
var eventType = xmlParser.eventType
var gameId = ""
var gameType = -1
var gameTitle = ""
var releaseYear = ""
var thumbnail = ""
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG && xmlParser.name == "item") {
gameId = xmlParser.getAttributeValue(null, "objectid")
val subtype = xmlParser.getAttributeValue(null, "subtype")
gameType = when (subtype) {
"boardgame" -> 1
"boardgameexpansion" -> 0
else -> -1
}
} else if (eventType == XmlPullParser.START_TAG && xmlParser.name == "name") {
gameTitle = xmlParser.nextText()
} else if (eventType == XmlPullParser.START_TAG && xmlParser.name == "yearpublished") {
releaseYear = xmlParser.nextText()
} else if (eventType == XmlPullParser.START_TAG && xmlParser.name == "thumbnail") {
thumbnail = xmlParser.nextText()
} else if (eventType == XmlPullParser.END_TAG && xmlParser.name == "item") {
// Dodawanie danych do bazy danych
val values = ContentValues().apply {
put(COLUMN_GAME_TITLE, gameTitle)
put(COLUMN_ORIGINAL_TITLE, "")
put(COLUMN_RELEASE_YEAR, releaseYear.toInt())
put(COLUMN_BGG_ID, gameId.toInt())
put(COLUMN_THUMBNAIL, thumbnail)
}
val db = writableDatabase
db.insert(TABLE_GAMES, null, values)
db.close()
}
eventType = xmlParser.next()
}
xmlInputStream.close()
}
}
插入方法是从另一个类调用的,但这里不是这种情况,因为表是从onCreate方法空创建的.
已将以下权限添加到android list :
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
个
我已经做了几次try ,以使其发挥作用,包括:
- 从仿真器文件中手动删除数据库
- 数据库版本从%1增加到%2
- 删除字符串内插并将其替换为纯文本
val CREATE_TABLE_GAMES = "CREATE TABLE $TABLE_GAMES(" +
"$COLUMN_GAME_TITLE TEXT," +
"$COLUMN_ORIGINAL_TITLE TEXT," +
"$COLUMN_RELEASE_YEAR INTEGER," +
"$COLUMN_BGG_ID INTEGER PRIMARY KEY," +
"$COLUMN_TYPE INTEGER," +
"$COLUMN_THUMBNAIL BLOB)"
- 以下代码重新格式化:
class DatabaseInit(context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {
companion object {
const val DATABASE_VERSION = 1
const val DATABASE_NAME = "boardgames.db"
const val TABLE_GAMES = "games"
const val COLUMN_GAME_TITLE = "game_title"
const val COLUMN_ORIGINAL_TITLE = "original_title"
const val COLUMN_RELEASE_YEAR = "release_year"
const val COLUMN_BGG_ID = "bgg_id"
const val COLUMN_TYPE = "type"
const val COLUMN_THUMBNAIL = "thumbnail"
private const val CREATE_TABLE_GAMES = "CREATE TABLE $TABLE_GAMES (" +
"$COLUMN_GAME_TITLE TEXT," +
"$COLUMN_ORIGINAL_TITLE TEXT," +
"$COLUMN_RELEASE_YEAR INTEGER," +
"$COLUMN_BGG_ID INTEGER PRIMARY KEY," +
"$COLUMN_TYPE INTEGER," +
"$COLUMN_THUMBNAIL BLOB)"
}
override fun onCreate(db: SQLiteDatabase) {
db.execSQL(CREATE_TABLE_GAMES)
}
//remaining code without changes
我的另一个 idea 是,程序不能看到那个数据库,但是创建空数据库会让我离开它.
提前感谢任何提示,如何解决我的问题.