MainActivityにてEditTextに入力した内容をSQLiteを使って保存し、別のアクティビティ(output)でListViewで表示することを目指しています。専門書に書かれているコードを参考にしてみたところ、入力した内容の保存や、保存した内容を別アクティビティでListViewを活用して表示する点については実現できました。
しかし、入力した内容が無限に保存されるようになってしまっています。私としては学校の時間割を入力して、別のページで確認できるようにしたいと思っています。たとえば1時間目に「国語」と入れると別のページでは「国語」と表示され、後から内容を修正し「数学」と入れた場合にはデータ内容を変更し、「数学」と表示させたいと考えています。現時点では単純にデータを保存することはできるのですが、特定の部分を修正することができないほか、保存するデータの数を制限(時間割の場合には7つほど)することができません。
初心者なので基本的な部分を見落としているかもしれませんが、アドバイスを頂けたら嬉しいです。
MainActivity.kt
import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.ArrayAdapter
import android.widget.Button
import android.widget.EditText
import android.widget.ListView
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val button2 = findViewById<Button>(R.id.button2)
button2.setOnClickListener {
val intent = Intent(this, output::class.java)
startActivity(intent)
}
val button = findViewById<Button>(R.id.button)
button.setOnClickListener {
val editText = findViewById<EditText>(R.id.editText)
val editText2 = findViewById<EditText>(R.id.editText2)
val editText3 = findViewById<EditText>(R.id.editText3)
insertText(this, editText.text.toString())
insertText(this,editText2.text.toString())
insertText(this, editText3.text.toString())
}
}
}
SampleDatabase.kt
import android.content.ContentValues
import android.content.Context
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
private const val DB_NAME = "SampleDatabase"
private const val DB_VERSION = 1
class SampleDBOpenHelper(context: Context) : SQLiteOpenHelper(context, DB_NAME, null, DB_VERSION) {
override fun onCreate(db: SQLiteDatabase?) {
// テーブルの作成
db?.execSQL("CREATE TABLE texts ( " +
" _id INTEGER PRIMARY KEY AUTOINCREMENT, " +
" text TEXT NOT NULL, " +
" created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)")
}
override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
// バージョン更新時のSQL発行
}
}
fun queryTexts(context: Context) : List<String> {
// 読み込み用のデータベースを開く
val database = SampleDBOpenHelper(context).readableDatabase
// データベースから全件検索する
val cursor = database.query("texts", null, null, null, null, null, "created_at DESC")
val texts = mutableListOf<String>()
cursor.use {
// カーソルで順次処理していく
while(cursor.moveToNext()) {
// 保存されているテキストを得る
val text = cursor.getString(cursor.getColumnIndex("text"))
texts.add(text)
}
}
database.close()
return texts
}
fun insertText(context: Context, text: String) {
// 書き込み可能なデータベースを開く
val database = SampleDBOpenHelper(context).writableDatabase
database.use { db ->
// 挿入するカラムと値を作成する
val record = ContentValues().apply {
// テキスト
put("text", text)
}
// データベースに挿入する
db.insert("texts", null, record)
}
}
output.kt
import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.ArrayAdapter
import android.widget.Button
import android.widget.ListView
class output : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_output)
val backbutton = findViewById<Button>(R.id.button6)
backbutton.setOnClickListener {
val intent = Intent(this,MainActivity::class.java)
startActivity(intent)
}
fun show() {
val texts = queryTexts(this)
val listView = findViewById<ListView>(R.id.listview)
listView.adapter = ArrayAdapter<String>(this, R.layout.list_item2, R.id.textView2, texts)
}
show()
}
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
まだ回答がついていません
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正の依頼
jimbe
2019/03/11 03:44
時間割りだそうですが, データベースには文字列しかありません.
私の時間割りのイメージですと, 曜日, 時限, 科目の3つが必要と思うのですが, データベース内でどのように表現される時間割りなのでしょうか.
sarobetsu
2019/03/11 06:28 編集
コメントありがとうございます。
確かに時間割の場合3つの要素が必要になりますが、まだSQLiteに慣れていないので現時点では
1つの要素(科目)だけを自分の意図したような形で保存し、管理することを目指しています。
jimbe
2019/03/11 09:26
それでは, どのようにして「修正」する「特定の部分」を指定するおつもりでしょうか.
現状では「手の通る穴の空いた箱に文字を書いた紙が何枚も入っている」だけです. これでは手を入れて一枚取り出しても, それが「特定の部分」なのかの確認さえ出来ないのではないでしょうか.
「管理する」のでしたら, 管理するための情報が必要です.
「『月』曜日の『1』時限目は『国語』」
「『火』曜日の『2』時限目は『理科』」
等となっていれば, 「『火』曜日の『2』時限目」という条件で「理科」を表示出来ますし, 「社会」に修正もできます.
システムの設計と同じく, データベースにも設計が存在致します. データベースを使用するのですから, 福引きのガラガラのように「何かが出てくれば良い」という訳ではないはずです. EXCEL のセルを列行で管理するように, データベースのデータも管理する情報が必要不可欠と思います.
sarobetsu
2019/03/11 11:29
コメントありがとうございます。
私としては、曜日や何限という情報はあらかじめTextViewを使って書き込んでおき、入力画面で科目名だけを入力して、時間割を確認する画面では対応する部分のTextViewに入力した科目名が表示されるようにしたいと思っているのですが、そのような方法は現実的ではないということでしょうか。
jimbe
2019/03/11 12:50
画面上は直接入力を省略できる所は省略したほうが良いと思いますので, そのような形にもなるかと思いますが, データベース上は, 基本的には, 表示しているものと同じ情報を持っている必要があります.
「たとえば1時間目に「国語」と入れる」とご質問で例をあげていらっしゃいますが, それを元に登録の流れを想像いたしますと,
1) "時間"(修正不可?)のテキストビューに自動で "1" と表示される
2) "科目"のテキストビューに"国語"と入力する
3) "登録"ボタンを押す
4) データベースに 時間=1, 科目=国語 と追加される.
5) "時間"のテキストビューが自動で "2" に変わる (科目のテキストビューがクリアされる)
6) "科目"のテキストビューに"数学"と入力する
7) 登録ボタンを押す
8) データベースに 時間=2, 科目=数学 と追加される
9) "時間"のテキストビューが自動で "3" に変わる (科目のテキストビューがクリアされる)
(以下略)
という感じでしょうか.
では確認する画面はどうでしょう.
リストビューで一覧を出すのでしたら, 時間順に並ぶ必要があるものと想像します. その為にデータベースからは"時間"の列を昇順にソートして読み込みます.
"created_at DESC" では無く "時間 DESC" ですね. ("created_at" 列では, 名称から察しますに, 今後追加削除が可能になった場合に並ばせ難くなりそうです.)
各行には"時間"と"科目"が並んで表示されるものと思います. また, 表示とは別に "_id" も各行で保持します.
確認画面で間違い(か修正する必要)があり, リストビューの1行をタップして, (登録した画面を流用した)修正画面になるとします
1) 確認画面の1行をタップ
2) タップした行の"_id"の値を, 登録画面のパラメータに設定して登録画面に遷移
3) 登録画面では _id を元にデータベースを読み込み, "時間"(修正不可?) と "科目" のテキストビューに表示
4) "科目"のテキストビューの内容を変更
5) 登録ボタンを押す
6) データベースの, "_id" がパラメータの _id と同じ行の"科目"を, 4) で入力した文字列に変更
7) 確認画面に戻る?
このような流れでしょうか.
sarobetsu
2019/03/11 12:58
私の考えているものと概ね合致しています。
的確なアドバイスありがとうございます。
参考にさせていただきたいと思います。