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

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

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

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

Android Studio

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

Kotlin

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

Q&A

0回答

606閲覧

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

sarobetsu

総合スコア13

Android

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

Android Studio

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

Kotlin

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

0グッド

0クリップ

投稿2019/03/10 04:59

編集2019/03/10 11:17

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() } }

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

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

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

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

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

jimbe

2019/03/10 18:44

時間割りだそうですが, データベースには文字列しかありません. 私の時間割りのイメージですと, 曜日, 時限, 科目の3つが必要と思うのですが, データベース内でどのように表現される時間割りなのでしょうか.
sarobetsu

2019/03/10 21:31 編集

コメントありがとうございます。 確かに時間割の場合3つの要素が必要になりますが、まだSQLiteに慣れていないので現時点では 1つの要素(科目)だけを自分の意図したような形で保存し、管理することを目指しています。
jimbe

2019/03/11 00:26

それでは, どのようにして「修正」する「特定の部分」を指定するおつもりでしょうか. 現状では「手の通る穴の空いた箱に文字を書いた紙が何枚も入っている」だけです. これでは手を入れて一枚取り出しても, それが「特定の部分」なのかの確認さえ出来ないのではないでしょうか. 「管理する」のでしたら, 管理するための情報が必要です. 「『月』曜日の『1』時限目は『国語』」 「『火』曜日の『2』時限目は『理科』」 等となっていれば, 「『火』曜日の『2』時限目」という条件で「理科」を表示出来ますし, 「社会」に修正もできます. システムの設計と同じく, データベースにも設計が存在致します. データベースを使用するのですから, 福引きのガラガラのように「何かが出てくれば良い」という訳ではないはずです. EXCEL のセルを列行で管理するように, データベースのデータも管理する情報が必要不可欠と思います.
sarobetsu

2019/03/11 02:29

コメントありがとうございます。 私としては、曜日や何限という情報はあらかじめTextViewを使って書き込んでおき、入力画面で科目名だけを入力して、時間割を確認する画面では対応する部分のTextViewに入力した科目名が表示されるようにしたいと思っているのですが、そのような方法は現実的ではないということでしょうか。
jimbe

2019/03/11 03: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 03:58

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問