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

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

ただいまの
回答率

90.51%

  • Android

    7090questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    4172questions

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

  • Kotlin

    539questions

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

Android Studio EditTextで入力した内容をSQLiteで保存したい

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 51

sarobetsu

score 1

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • 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

    私の考えているものと概ね合致しています。
    的確なアドバイスありがとうございます。
    参考にさせていただきたいと思います。

    キャンセル

まだ回答がついていません

同じタグがついた質問を見る

  • Android

    7090questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    4172questions

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

  • Kotlin

    539questions

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