質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

1244閲覧

[Kotlin] ラジオボタンで選択した項目をデータベース(SQLite)に保存する。

android_app_tw

総合スコア4

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2022/12/07 11:49

現在、簡単なメモアプリを作成しております。
その際に、Mainとは別のアクティビティで選択したラジオボタンの項目をDB(SQLite)に保存し、画面遷移しても選択された項目をそのままにしたいと思っています。
下記のように実装していますがうまく動作しないのが現状です。

該当箇所に★マークを付けています。

MemoActivity.kt

1package to.msn.wings.onsen_memo_2 2 3import android.app.DatePickerDialog 4import android.app.DatePickerDialog.OnDateSetListener 5import android.content.ContentValues 6import android.media.Rating 7import android.os.Bundle 8import android.view.Menu 9import android.view.MenuItem 10import android.view.View 11import android.widget.* 12import androidx.appcompat.app.AppCompatActivity 13import java.text.FieldPosition 14import java.util.* 15 16class MemoActivity:AppCompatActivity() { 17 18 19 companion object{ 20 private const val TABLE_NAME = "memos" 21 } 22 23 24 25 override fun onCreate(savedInstanceState: Bundle?) { 26 super.onCreate(savedInstanceState) 27 setContentView(R.layout.memo) 28 29 supportActionBar?.setDisplayHomeAsUpEnabled(true) 30 31 val helper = DBHelper(this) 32 val memoId: Long = intent.getLongExtra("id",0) 33 val textTitle = findViewById<EditText>(R.id.text_title) 34 val textContent = findViewById<EditText>(R.id.text_content) 35 val rate = findViewById<RatingBar>(R.id.rating) 36 val textDate = findViewById<EditText>(R.id.text_date) 37 val textonsen = findViewById<EditText>(R.id.text_onsen) 38 val buttononsen = findViewById<Button>(R.id.btn_onsen) 39 val buttonsento = findViewById<Button>(R.id.btn_sento) 40 val rgroup = findViewById<RadioGroup>(R.id.rgroup) ★ 41 42 43 44 if (memoId != 0L) { 45 helper.readableDatabase.use { db -> 46 db.query( 47 TABLE_NAME, 48 arrayOf("id", "title", "content","rating","date","onsen","radio"), 49 "id = ?", 50 arrayOf(memoId.toString()), 51 null, 52 null, 53 null, 54 "1" 55 ) 56 .use { cursor -> 57 if (cursor.moveToFirst()) { 58 textTitle.setText(cursor.getString(1)) 59 textContent.setText(cursor.getString(2)) 60 rate.setRating(cursor.getFloat(3)) 61 textDate.setText(cursor.getString(4)) 62 textonsen.setText(cursor.getString(5)) 63 rgroup.setId(cursor.getInt(6)) ★ 64 } 65 } 66 67 } 68 } 69 70 findViewById<Button>(R.id.save_button).setOnClickListener{ 71 helper.writableDatabase.use { 72 db -> 73 val values = ContentValues().apply { 74 put("title", textTitle.text.toString()) 75 put("Content", textContent.text.toString()) 76 put("rating",rate.rating) 77 put("date",textDate.text.toString()) 78 put("onsen",textonsen.text.toString()) 79 put("radio",rgroup.checkedRadioButtonId) ★ 80 } 81 if (memoId != 0L) { 82 db.update(TABLE_NAME, values,"id = ?", arrayOf(memoId.toString())) 83 } else { 84 db.insert(TABLE_NAME,null, values) 85 } 86 } 87 finish() 88 } 89 }

DBHelper.kt

1package to.msn.wings.onsen_memo_2 2 3import android.content.Context 4import android.database.sqlite.SQLiteDatabase 5import android.database.sqlite.SQLiteOpenHelper 6 7class DBHelper(context: Context?): SQLiteOpenHelper(context,DBNAME,null,version) { 8 companion object{ 9 private const val DBNAME = "DBSample.sqlite" 10 private const val version = 1 11 } 12 13 override fun onCreate(db: SQLiteDatabase?) { 14 db?.let { 15 it.execSQL("create table memos(id integer primary key, title text, content text,rating real,date text,onsen text,radio integer)") 16 } 17 } 18 19 override fun onUpgrade(p0: SQLiteDatabase?, p1: Int, p2: Int) { 20 21 } 22 23 override fun onOpen(db: SQLiteDatabase?) { 24 super.onOpen(db) 25 } 26}

そもそもSQLiteにはラジオボタンから取得したIDを登録できないのか、
また、SQLite書き込みの際に、<RadioGoupe>ではなく、<RadioButton>にID値を投入するのかわからない状況です。
もし何かアドバイス等ありましたらご教授していただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

レイアウト xml に書いた id をコードで使えるようにする R.id.xxx というのは int の定数です。
ですので SQLite の integer に入れることが出来ると思います。
が、 R.id.xxx の値は AndroidStudio が自動的にテキトウに決めた値ですので、何かの拍子に値が変わってしまう可能性があります。
以前は 100 だったのに今は 200 になっているとかがあり得るということで、もしそうなってしまったら、データベースに 100 と入っているのに該当するボタンが無い! なんてことになります。
ですので一般的にはビューの id をデータベースに入れることはしないでしょう。

ラジオボタンのそれぞれに番号を付けたつもりになって、1 つ目が選択なら 1 、 2 つ目が選択なら 2 をデータベースに書き込み、読み込みは 1 が入っていたら 1 つ目を選択状態にし、 2 が入っていたら 2 つ目を選択状態に・・・というのが一つの方法です。(これもまだ危なっかしいですが。)

もう少しちゃんとするなら、選択されたもの自体の情報をデータベースに入れることです。
例えば "java" か "kotlin" かを選ぶラジオボタンだったとして、番号(並び順)をデータベースに入れる方法だと java だったら 1 、 kotlin だったら 2 という感じになります。が、もし後から『これからは kotlin だから kotlin を先にしよう』とか『いやいや xamarin こそ一番目に追加だ』とかいう様々な理由で並びが変わる可能性があり、変わってしまったらデータベースの 1 が ラジオボタンの 1 番目では無くなるかもしれません。
そこで、実際に選ぶのは "java" か "kotlin" か ("xamarin" か) なのですから、データベースにも java が選ばれていたら "java"、 kotlin が選ばれていたら "kotlin" ( xamarin が選ばれ(ry ) という文字列そのものを入れてしまえば、データベースを直接見た場合も 1 とか 2 とかより分かり易いと思います。
(この考えでいけば、先の番号を保存する方法も、順番の番号では無く=順番に関係無く java は 1 、 kotlin は 2 と割り当てて 1や 2 を保存するということでも同じになりますが、データベースを直接見て「これ 1 って何だっけ?」というよりは文字列で書いてあるほうが分かり易いです。)

投稿2022/12/07 12:13

編集2022/12/07 12:34
jimbe

総合スコア12632

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

android_app_tw

2022/12/07 14:34

回答ありがとうございます。 試しにですが、下記のように文字列を保存して、その文字列から再度画面を開いたときに、チェックされてるかされてないかの判断をしようとしました。 R.id.rb1にテキスト(Java) R.id.rb2にテキスト(Kotlin)を入れています。 val rgroup = findViewById<RadioGroup>(R.id.rgroup) val radioId = rgroup.checkedRadioButtonId val radioText = findViewById<RadioButton>(radioId) .use { cursor -> if (cursor.moveToFirst()) { textTitle.setText(cursor.getString(1)) textContent.setText(cursor.getString(2)) rate.setRating(cursor.getFloat(3)) textDate.setText(cursor.getString(4)) textonsen.setText(cursor.getString(5)) if (cursor.getString(6) == "Java"){ ★ rgroup.check(R.id.rb1) }else{ rgroup.check(R.id.rb2) } } } val values = ContentValues().apply { put("title", textTitle.text.toString()) put("Content", textContent.text.toString()) put("rating",rate.rating) put("date",textDate.text.toString()) put("onsen",textonsen.text.toString()) put("radio",radioText.text.toString()) ★ } ただ、上記設定を行ったときに java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence android.widget.RadioButton.getText()' on a null object reference のようなエラーが出てしまいます。 これに対する対処法等はなにか考えられますでしょうか。
jimbe

2022/12/07 17:58 編集

それぞれのコードブロックが質問本文の★の付いているブロックに対応するのだと思いますが、だとすると、 val radioId = rgroup.checkedRadioButtonId がそこでは、まだラジオボタンが選択されていませんので 0 になっていると思います。 val radioId = rgroup.checkedRadioButtonId val radioText = findViewById<RadioButton>(radioId) の 2 行はラジオボタンが選択された状態で実行しなければ意味がありませんので、素直に val values = ContentValues().apply { の直前で行っては如何でしょうか。 ついでにですが、 if (cursor.getString(6) == "Java"){ ★ rgroup.check(R.id.rb1) }else{ rgroup.check(R.id.rb2) } というのは、ラジオボタンが増減したら問題になる書き方です。 データベースへ書き込む文字列をラジオボタンのテキストにするのでしたら、この部分も『ラジオグループに含まれる各ラジオボタンの中でテキストが cursor.getString(6) と一致するものを チェックする』ようにしたほうが良いと思います。 そうすれば、ラジオボタンが幾つあってもどんなテキストでも(同じテキストのボタンが複数で無いかぎり)選んだテキストがデータベースに入り、読み込んだ時にそのボタンが(存在すれば)選択した状態に出来るでしょう。
android_app_tw

2022/12/08 03:00

回答ありがとうございます! 上記試した結果、やりたいことができました。 また、色々と勉強になります。対応ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問