Android, готовая БД SQLite. Не создаётся таблица
Пишу android-приложение на Kotlin. К нему подключил готовую БД на sqlite, но так как только начинаю изучать всю эту тему, знаний на самостоятельное подключение базы не хватило, поэтому скопипастил код из какого-то гайда. В итоге база вроде подключилась, но при попытке создать внутри неё таблицу ничего не происходит. Саму базу создавал через DB Browser и через него же проверял работоспособность sql-запроса, который будет создавать таблицу уже внутри приложения.
Код DBHelper'а
class DBHelper ( private val context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION ) {
private val preferences: SharedPreferences = context.getSharedPreferences(
context.packageName, Context.MODE_PRIVATE
)
private fun installedDatabaseIsOutdated(): Boolean {
return preferences.getInt(DATABASE_NAME, 0) < DATABASE_VERSION
}
private fun writeDatabaseVersionInPreferences() {
preferences.edit().apply {
putInt(DATABASE_NAME, DATABASE_VERSION)
apply()
}
}
private fun installDatabaseFromAssets() {
val inputStream = context.assets.open("$ASSETS_PATH/$DATABASE_NAME")
try {
val outputFile = File(context.getDatabasePath(DATABASE_NAME).path)
val outputStream = FileOutputStream(outputFile)
inputStream.copyTo(outputStream)
inputStream.close()
outputStream.flush()
outputStream.close()
} catch (exception: Throwable) {
throw RuntimeException("The $DATABASE_NAME database couldn't be installed.", exception)
}
}
@Synchronized
private fun installOrUpdateIfNecessary() {
if (installedDatabaseIsOutdated()) {
context.deleteDatabase(DATABASE_NAME)
installDatabaseFromAssets()
writeDatabaseVersionInPreferences()
}
}
override fun getWritableDatabase(): SQLiteDatabase {
return super.getWritableDatabase()
}
override fun getReadableDatabase(): SQLiteDatabase {
installOrUpdateIfNecessary()
return super.getReadableDatabase()
}
override fun onCreate(db: SQLiteDatabase?) {
db?.execSQL(DBNameClass.CREATE_TABLE_ORDERS)
db?.execSQL(DBNameClass.CREATE_TABLE_BUSKET)
}
override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
}
}
Тут хранятся все имена для базы
object DBNameClass : BaseColumns {
const val TABLE_NAME_BUSKET = "busket"
const val COLUMN_NAME_MENUID = "id_menu"
const val COLUMN_NAME_KOLVO = "kol_vo"
const val COLUMN_NAME_ORDERID = "id_order"
const val TABLE_NAME_ORDERS = "orders"
const val COLUMN_NAME_ID = "id"
const val COLUMN_NAME_CLIENTNAME = "client_name"
const val COLUMN_NAME_CLIENTADD = "client_address"
const val COLUMN_NAME_CLIENTNUMBER = "client_number"
const val COLUMN_NAME_ORDERDATA = "order_date"
const val TABLE_NAME_MENU = "menu"
const val COLUMN_NAME_IDMENU = "_id"
const val COLUMN_NAME_MENUNAME = "menu_name"
const val COLUMN_NAME_MENUCOST = "menu_cost"
const val DATABASE_VERSION = 2
const val DATABASE_NAME = "dostavka.db"
const val ASSETS_PATH = "database"
const val CREATE_TABLE_ORDERS = "CREATE TABLE IF NOT EXISTS $TABLE_NAME_ORDERS (" +
"$COLUMN_NAME_ID INTEGER PRIMARY KEY," +
"$COLUMN_NAME_CLIENTNAME TEXT NOT NULL," +
"$COLUMN_NAME_CLIENTADD TEXT NOT NULL," +
"$COLUMN_NAME_CLIENTNUMBER INTEGER NOT NULL," +
"$COLUMN_NAME_ORDERDATA TEXT NOT NULL);"
const val CREATE_TABLE_BUSKET = "CREATE TABLE IF NOT EXISTS $TABLE_NAME_BUSKET (" +
"$COLUMN_NAME_MENUID INTEGER NOT NULL," +
"$COLUMN_NAME_KOLVO INTEGER NOT NULL," +
"$COLUMN_NAME_ORDERID INTEGER," +
"FOREIGN KEY ($COLUMN_NAME_MENUID) REFERENCES menu(_id)," +
"FOREIGN KEY ($COLUMN_NAME_ORDERID) REFERENCES $TABLE_NAME_ORDERS($COLUMN_NAME_ID));"
}
Класс для операций над базой
class DBManager(context: Context) {
private val dbHelper = DBHelper(context)
var db : SQLiteDatabase? = null
@SuppressLint("Recycle")
fun readDB() {
db = dbHelper.readableDatabase
}
fun writeDB(){
db = dbHelper.writableDatabase
}
fun addItemInBusket (menuid: Int, kolvo: Int, orderid: Int) {
val values = ContentValues().apply {
put(DBNameClass.COLUMN_NAME_MENUID, menuid)
put(DBNameClass.COLUMN_NAME_KOLVO, kolvo)
put(DBNameClass.COLUMN_NAME_ORDERID, orderid)
}
}
}
В главное активити делаю базу доступной для записи
class MainActivity : AppCompatActivity(), AdapterView.OnItemSelectedListener {
@SuppressLint("Recycle")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val dbManager = DBManager(this)
dbManager.writeDB()
}
Сама база хранится в папке assets/database