PROGRAMMING
Android Kotlin
- UiState の値が変わっても UI が変化しない?
- Room での SQL いろいろ
- Room を使うための Application Database Dao Repository ViewModel
- Room を使うための事前準備 (設定)
- 外部(共有)ストレージの Media ファイルへのアクセス
- 外部(共有)ストレージの Document ファイルへのアクセス
- 内部(App固有)ストレージへのアクセス
javascript
- ページャーを作る(簡易版)
- ページャーを作る 4/4
(クロスブラウザ対策)
(ページャー表示用メソッド)
(ページャーの使い方) - ページャーを作る 3/4
(イベント登録) - ページャーを作る 2/4
(スタイルの設定) - ページャーを作る 1/4
(ページャー用関数を準備)
(各要素を生成) - 自作カレンダーを作る 6/6
(11.~14.各種メソッド)
(15.簡単な使い方) - 自作カレンダーを作る 5/6
(09.祝休日の判定)
(10.閏年の判定) - 自作カレンダーを作る 4/6
(08.イベントの設定) - 自作カレンダーを作る 3/6
(07.スタイルの設定) - 自作カレンダーを作る 2/6
(05.カレンダーのマスのみ作成)
(06.各マスへ年月・日付を埋め込み) - 自作カレンダーを作る 1/6
(01.カレンダーの基を準備)
(02.各月の日数や年月日の区切り文字)
(03.前月・次月指定時の処理)
(04.前月・次月部分の年月を算出) - JS-Image-Resizerを使って画像を高画質で縮小
- ファイルを作成しローカルに保存
- モーダルウィンドウをクラス化
- ストップウォッチを作る
- XMLHttpRequest Lebel2を試してみる
- jQuery:Tableで親・子・兄弟要素を取得
- 文字列をセパレータ文字で分割し配列で返す関数
- forループのカウンタを使用している関数の定義
- クロージャの使いどころ
- JSONPでクロスドメイン
- AjaxでJSON形式のデータを扱う
- jsファイルからjsファイルを呼び出す
- jQuery:モーダルウィンドウを作ってみる
PHP
Java
- IntelliJ.Gradle.JavaFX(6) プラグイン org.beryx.jlink を使ってみる
- IntelliJ.Gradle.JavaFX(5) NSISでインストーラーを作る
- IntelliJ.Gradle.JavaFX(4) exewrapで実行可能jarをexe化する
- IntelliJ.Gradle.JavaFX(3) Jlink でカスタム JRE を作る
- IntelliJ.Gradle.JavaFX(2) すべての依存対象を含んだ Fatjar を作る
- IntelliJ.Gradle.JavaFX(1) アプリケーションを作る
- javaのコンパイルと実行
- イメージを回転する
- Exif情報を簡単に取得できるライブラリ
- 高画質で画像縮小
- JDBCによるデータベース操作
Room での SQL いろいろ
Room では SQL の記述が他のデータベースと微妙に違うように感じます。
標準的な書き方でいいと思っても期待した結果がでません。そこで解決した書き方をメモっておくことにしました。(2025.06.19)
≪開発環境≫
windows11
andriod studio Ladybug
01. INSERT時にAUTO_INCREMENTで自動付与されたナンバーを取得する
SQL では無いがたまに必要になるので忘れないようにメモっておきます。
関数の戻り値に Long を指定すると取得できるようになります。
Dao
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertMember(user: Users): Long // Insert 操作後の ID を取得
Repository
suspend fun insertMember(userName: String, telNumber: String): Long {
return dao.insertMember(Users(0, userName, telNumber, false))
}
ViewModel
fun insertMember() {
viewModelScope.launch {
val userName = userNameState.text.toString()
val telNumber = telNumberState.text.toString()
// Insert をして更にインクリメントされた ID を取得
val id = repo.insertMember(userName, telNumber)
// 取得した ID を別な Insert に使う
repo.insertGroupMember(it, id.toInt())
}
}
02. AテーブルのカラムでBテーブルのカラムを更新する
これ例もなかなか実現できませんでした。Stack Overflow でも色んな例がありましたが次の SQL だけが上手くいきました。
Dao
// Groups テーブルの flag で Users テーブルの flag を更新する
@Query("UPDATE users SET flag = " +
"(SELECT gFlag FROM groups WHERE gName = :gName AND userId = gUserId) " +
"where EXISTS " +
"(SELECT gUserId FROM groups WHERE gName = :gName AND userId = gUserId)")
suspend fun updateFlagGtoU(gName: String)
03. 抽出するカラムに合わせてデータクラスを作る
INNER JOIN などでの複数テーブルからの抽出や、単数テーブルからの一部カラム抽出では 必ず抽出カラムに合わせてデータクラスを作成する。
Dao
@Query("SELECT u.userId, u.userName, g.gUserId, g.gName, g.gFlag " +
"FROM groups g INNER JOIN users u ON g.gUserId = u.userId WHERE gName = :group")
fun getGroupMembers(group: String): Flow>
UserAndGroup データクラス
data class UserAndGroup(
val userId: Int,
val userName: String,
val gUserId: Int,
val gName: String,
val gFlag: Boolean = true
)
04. IN句のパラメータ
IN句のように個数が変化するパラメータはリストにするとよい。
Dao
@Query("SELECT * FROM users WHERE userId IN (:userIds)")
fun getUsersByIds(userIds: List): List
まとめ
これからも新たに知った SQL など Dao の書き方があれば追記していきます。