Как скопировать столбец в другой столбец в базе данных SQlite с помощью kotlin - PullRequest
0 голосов
/ 11 января 2019

У меня есть база данных SQlite в приложении для Android, разработанном в kotlin. В этой базе данных я храню объекты этого class

класс Device_info

class Device_info {
var id : Int = 0
var name : String = ""

constructor(id : Int, name: String){
        this.id = id
        this.name = name
    }
}

Теперь в переменной id я хочу сохранить raw_id, который база данных автоматически выдаст. В некоторых руководствах я нашел, как создать обработчик базы данных, и сделал это так:

класс обработчика базы данных

import android.content.ContentValues
import android.content.Context
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper

private const val DATABASE_NAME = "Devices_db"
private const val TABLE_NAME = "Devices"
private const val RAW_ID = "raw_id"
private const val COLUMN_NAME = "name"
private const val COLUMN_ID = "id"




class DataBaseHandler(var context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, 1) {
    override fun onCreate(db: SQLiteDatabase?) {
        val createTable = "CREATE TABLE " + TABLE_NAME + "(" + RAW_ID +
            " INTEGER PRIMARY KEY, " + COLUMN_NAME + " TEXT, " +
            COLUMN_ID + "INTEGER)"

        db?.execSQL(createTable)
    }

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


    fun insertData(device: Device_info){
        val db = this.writableDatabase
        val cv = ContentValues()

        cv.put(COLUMN_ID, device.id)
        cv.put(COLUMN_NAME, device.name)
        db.insert(TABLE_NAME, null, cv)

        db.close()
    }

    fun readData() : MutableList<Device_info>{
        val list : MutableList<Device_info> = ArrayList()
        val db = this.readableDatabase

        val query = "Select * from " + TABLE_NAME
        val result = db.rawQuery(query, null)

        if(result.moveToFirst()){
            do{
                val device = Device_info()

                device.id = result.getString(result.getColumnIndex(COLUMN_ID)).toInt()
                device.name = result.getString(result.getColumnIndex(COLUMN_NAME)    
                list.add(device)

            }while(result.moveToNext())
        }

        result.close()
        db.close()

        return list
    }


    fun UpdateId(device: Device_info){
        val db = this.readableDatabase
        val cv = ContentValues()

        cv.put(COLUMN_ID, device.id)

        db.update(TABLE_NAME, cv, "id = " + device.id, null)

        db.close()
    }

    fun UpdateName(device: Device_info){
        val db = this.readableDatabase
        val cv = ContentValues()

        cv.put(COLUMN_NAME, device.name)
        cv.put(COLUMN_ID, device.id)

        db.update(TABLE_NAME, cv, "id = " + device.id, null)

        db.close()
    }



    fun deleteData(device: Device_info){
        val db = this.writableDatabase
        val cv = ContentValues()

        cv.put(COLUMN_ID, device.id)
        cv.put(COLUMN_NAME, device.name)
        db.delete(TABLE_NAME, "id = " + device.id, null)

        db.close()
    }
}

Так что после того, как я создаю объект, передавая конструктору имя и как id -1, потому что в то время я не знаю raw_id, так как я не добавил объект в данные base, я вызываю функцию insertData, и объект успешно сохраняется в базе данных, но столбец id содержит -1 для всех элементов. У меня вопрос, как я могу скопировать столбец raw_id в столбец id?

1 Ответ

0 голосов
/ 11 января 2019

Почему два столбца хранят одно и то же значение? Если только вы не собираетесь манипулировать идентификаторами, которые не рекомендуется.

Доступ к одному столбцу raw_id будет более эффективным. Это не потеряло бы пространство, позволило бы кэшировать больше данных и т. Д.

Я предполагаю, что ключ к вашему намерению находится в , потому что в то время я не знаю raw_id, так как я не добавил объект в базу данных В этом вы в основном хотите знать, что id есть. Ниже описано, как вы можете получить id (raw_id): -

Вы извлекаете значение, возвращаемое из insert , и возвращаете его из метода insertData .

Что-то вроде: -

fun insertData(device: Device_info): Long{
    val db = this.writableDatabase
    val cv = ContentValues()

    cv.put(COLUMN_ID, device.id)
    cv.put(COLUMN_NAME, device.name)
    val rv = db.insert(TABLE_NAME, null, cv)
    db.close()
    return rv
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...