SubwayTooter-Android-App/app/src/main/java/jp/juggler/subwaytooter/table/FavMute.kt

103 lines
3.4 KiB
Kotlin

package jp.juggler.subwaytooter.table
import android.content.ContentValues
import android.database.sqlite.SQLiteDatabase
import android.provider.BaseColumns
import jp.juggler.subwaytooter.api.entity.Acct
import jp.juggler.util.data.TableCompanion
import jp.juggler.util.log.LogCategory
class FavMute(
var id: Long = 0L,
val acct: String = "",
) {
companion object : TableCompanion {
private val log = LogCategory("FavMute")
override val table = "fav_mute"
const val COL_ID = BaseColumns._ID
const val COL_ACCT = "acct"
override fun onDBCreate(db: SQLiteDatabase) {
log.d("onDBCreate!")
db.execSQL(
"""create table if not exists $table
($COL_ID INTEGER PRIMARY KEY
,$COL_ACCT text not null
)""".trimIndent()
)
db.execSQL("create unique index if not exists ${table}_acct on $table($COL_ACCT)")
}
override fun onDBUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
if (oldVersion < 22 && newVersion >= 22) {
onDBCreate(db)
}
}
}
class Access(val db: SQLiteDatabase) {
fun save(acct: Acct?) {
acct ?: return
try {
val cv = ContentValues()
cv.put(COL_ACCT, acct.ascii)
db.replace(table, null, cv)
} catch (ex: Throwable) {
log.e(ex, "save failed.")
}
}
fun delete(acct: Acct) {
try {
db.delete(table, "$COL_ACCT=?", arrayOf(acct.ascii))
} catch (ex: Throwable) {
log.e(ex, "delete failed.")
}
}
fun listAll() =
db.rawQuery(
"select * from $table order by $COL_ACCT asc",
emptyArray()
)?.use { cursor ->
buildList {
val idxId = cursor.getColumnIndex(COL_ID)
val idxAcct = cursor.getColumnIndex(COL_ACCT)
while (cursor.moveToNext()) {
add(
FavMute(
id = cursor.getLong(idxId),
acct = cursor.getString(idxAcct)
)
)
}
}
} ?: emptyList()
fun acctSet(): Set<Acct> = buildSet {
try {
db.query(table, null, null, null, null, null, null)
.use { cursor ->
val idx_name = cursor.getColumnIndex(COL_ACCT)
while (cursor.moveToNext()) {
val s = cursor.getString(idx_name)
add(Acct.parse(s))
}
}
} catch (ex: Throwable) {
log.e(ex, "acctSet load failed.")
}
}
fun contains(acct: Acct): Boolean =
try {
db.query(table, null, "$COL_ACCT=?", arrayOf(acct.ascii), null, null, null)
?.use { it.moveToNext() }
} catch (ex: Throwable) {
log.e(ex, "contains failed.")
null
} ?: false
}
}