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

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

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

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

Q&A

解決済

1回答

5108閲覧

activityをfinish()したときに画面が更新されない

olee46

総合スコア32

Android

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

0グッド

0クリップ

投稿2017/06/08 08:27

編集2017/06/14 04:44

やりたいこと:

表示画面
入力画面

表示画面でFloatingActionButtonをクリック

入力画面でデータを入力

表示画面の情報を更新

※日付とAM/PMがありますが、現時点ではデータベースの全レコードを表示するのみです。

困っていること:

入力画面からfinish()で表示画面に戻っても、データベースの表示が更新されない

やってみたこと:

  • 操作しているデータベースのテーブル名・フィールド名の一致を確認
  • Androidのライフサイクルについて調べる → 入力画面のactivity終了後に呼ばれる表示画面のメソッドはonResumeと解釈 → onResumeにデータベース表示の処理を記述

備考:

質問の内容以外でも、コードの書き方等で問題があれば、ご指摘いただければ幸いです。

コード:

MainActivity.java

java

1package com.example.orisa.mytask3; 2 3import android.content.ContentValues; 4import android.content.Intent; 5import android.database.Cursor; 6import android.database.sqlite.SQLiteDatabase; 7import android.support.design.widget.FloatingActionButton; 8import android.support.v7.app.AppCompatActivity; 9import android.os.Bundle; 10import android.view.View; 11import android.widget.LinearLayout; 12import android.widget.TextView; 13import android.widget.Toast; 14 15import org.w3c.dom.Text; 16 17public class MainActivity extends AppCompatActivity { 18 19 //部品の変数 20 LinearLayout amLayout, pmLayout; 21 FloatingActionButton fab; 22 23 @Override 24 protected void onCreate(Bundle savedInstanceState) { 25 super.onCreate(savedInstanceState); 26 setContentView(R.layout.activity_main); 27 28 //部品の取得 29 amLayout = (LinearLayout)findViewById(R.id.amLayout); 30 pmLayout = (LinearLayout)findViewById(R.id.pmLayout); 31 fab = (FloatingActionButton)findViewById(R.id.fab); 32 33 //データベースの取得 34 MyDBHelper helper = new MyDBHelper(MainActivity.this); 35 SQLiteDatabase db = helper.getWritableDatabase(); 36 37 //データベースの表示 38 Cursor c = db.query("default_tb", new String[]{"task_col", "date_col", "time_col"}, 39 null, null, null, null, null, null); 40 boolean isEof = c.moveToFirst(); 41 while (isEof){ 42 //TextViewインスタンスの生成 43 TextView tv = new TextView(MainActivity.this); 44 //taskの取得 45 tv.setText(c.getString(0)); 46 //taskの表示 47 amLayout.addView(tv); 48 //Cursorを次のレコードへ 49 isEof = c.moveToNext(); 50 } 51 c.close(); 52 53 54 //FloatingActionButtonにリスナーを登録 55 fab.setOnClickListener(new View.OnClickListener() { 56 @Override 57 public void onClick(View v) { 58 //Intentインスタンスの生成 59 Intent intent = new Intent(getApplication(), AddActivity.class); 60 //activityの開始 61 startActivity(intent); 62 } 63 }); 64 } 65 66 @Override 67 protected void onResume() { 68 super.onResume(); 69 70 //データベースの取得 71 MyDBHelper helper = new MyDBHelper(MainActivity.this); 72 SQLiteDatabase db = helper.getReadableDatabase(); 73 74 //データベースの表示 75 Cursor c = db.query("default_tb", new String[]{"task_col", "date_col", "time_col"}, 76 null, null, null, null, null, null); 77 boolean isEof = c.moveToFirst(); 78 while (isEof){ 79 //TextViewインスタンスの生成 80 TextView tv = new TextView(MainActivity.this); 81 //taskの取得 82 tv.setText(c.getString(0)); 83 //taskの表示 84 amLayout.addView(tv); 85 //Cursorを次のレコードへ 86 isEof = c.moveToNext(); 87 } 88 c.close(); 89 } 90}

AddActivity.java

java

1package com.example.orisa.mytask3; 2 3import android.app.DatePickerDialog; 4import android.content.ContentValues; 5import android.database.Cursor; 6import android.database.sqlite.SQLiteDatabase; 7import android.icu.util.Calendar; 8import android.os.Bundle; 9import android.support.annotation.Nullable; 10import android.support.v7.app.AppCompatActivity; 11import android.view.View; 12import android.widget.AdapterView; 13import android.widget.ArrayAdapter; 14import android.widget.Button; 15import android.widget.DatePicker; 16import android.widget.EditText; 17import android.widget.Spinner; 18import android.widget.TextView; 19import android.widget.Toast; 20 21import java.lang.reflect.Array; 22 23/** 24 * Created by orisa on 2017/06/08. 25 */ 26 27public class AddActivity extends AppCompatActivity { 28 29 //部品の取得 30 EditText addTask, addDate; 31 Spinner spinner; 32 Button okBtn, cancelBtn; 33 34 //Spinner用の変数 35 String[] items = {"AM", "PM"}; 36 37 //データを入れる用の変数 38 String task, date, time; 39 40 @Override 41 protected void onCreate(@Nullable Bundle savedInstanceState) { 42 super.onCreate(savedInstanceState); 43 setContentView(R.layout.activity_add); 44 45 //部品の取得 46 addTask = (EditText)findViewById(R.id.addTask); 47 addDate = (EditText)findViewById(R.id.addDate); 48 spinner = (Spinner)findViewById(R.id.spinner); 49 okBtn = (Button)findViewById(R.id.okBtn); 50 cancelBtn = (Button)findViewById(R.id.cancelBtn); 51 52 //日付の入力の設定 53 addDate.setOnClickListener(new View.OnClickListener() { 54 @Override 55 public void onClick(View v) { 56 //Calendarインスタンスの生成 57 Calendar cal = Calendar.getInstance(); 58 //DatePickerDialogインスタンスの生成 59 DatePickerDialog dialog = new DatePickerDialog(AddActivity.this, 60 new DatePickerDialog.OnDateSetListener() { 61 @Override 62 public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { 63 //日付を取得して表示 64 addDate.setText(String.format("%d/%02d/%02d", year, month+1, dayOfMonth)); 65 } 66 }, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH),cal.get(Calendar.DAY_OF_MONTH)); 67 //DatePickerDialogの表示 68 dialog.show(); 69 } 70 }); 71 72 //AM/PM入力の設定 73 ArrayAdapter<String> adapter = new ArrayAdapter<String>(AddActivity.this, android.R.layout.simple_spinner_dropdown_item, 74 items); 75 adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 76 spinner.setAdapter(adapter); 77 78 //Spinnerにリスナーを登録 79 spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 80 @Override 81 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 82 //選択されたStringを取得 83 time = (String)parent.getSelectedItem(); 84 } 85 86 @Override 87 public void onNothingSelected(AdapterView<?> parent) { 88 } 89 }); 90 91 //データベースの作成 92 MyDBHelper helper = new MyDBHelper(AddActivity.this); 93 final SQLiteDatabase db = helper.getWritableDatabase(); 94 95 //OKボタンクリック時の処理 96 okBtn.setOnClickListener(new View.OnClickListener() { 97 @Override 98 public void onClick(View v) { 99 //taskとdateを取得 100 task = addTask.getText().toString(); 101 date = addDate.getText().toString(); 102 //ContentValuesにデータを入れる 103 ContentValues val = new ContentValues(); 104 val.put("task_col", task); 105 val.put("date_col", date); 106 val.put("time_col", time); 107 //データベースに登録 108 db.insert("default_tb", null, val); 109 //Toastを表示 110 Toast.makeText(AddActivity.this, "added task: "+task+" "+" "+date+" "+time, 111 Toast.LENGTH_SHORT).show(); 112 //activityの終了 113 finish(); 114 } 115 }); 116 117 //CANCELボタンクリック時の処理 118 cancelBtn.setOnClickListener(new View.OnClickListener() { 119 @Override 120 public void onClick(View v) { 121 //activityの終了 122 finish(); 123 } 124 }); 125 } 126}

MyDBHelper.java

java

1package com.example.orisa.mytask3; 2 3import android.content.Context; 4import android.database.sqlite.SQLiteDatabase; 5import android.database.sqlite.SQLiteOpenHelper; 6 7/** 8 * Created by orisa on 2017/06/08. 9 */ 10 11public class MyDBHelper extends SQLiteOpenHelper { 12 13 public MyDBHelper(Context context){ 14 super(context, null, null, 1); 15 } 16 17 @Override 18 public void onCreate(SQLiteDatabase db) { 19 //SQL文を入れる 20 String sql = "CREATE TABLE default_tb(_id INTEGER PRIMARY KEY NOT NULL, task_col TEXT, date_col TEXT, time_col TEXT);"; 21 db.execSQL(sql); 22 } 23 24 @Override 25 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 26 } 27}

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

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

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

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

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

guest

回答1

0

ベストアンサー

おかしいと思ったらデバッグをしましょう。

まず、更新Activityのインサート箇所でSQLiteDatabase#insertの戻り値を確認してください。戻り値が-1ならインサートが失敗しています。

投稿2017/06/08 08:44

yona

総合スコア18155

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

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

olee46

2017/06/08 09:28

回答ありがとうございます db.insertの結果を表示させたところ、1になっていましたので、インサートは成功しているようです
yona

2017/06/08 10:05

インサートが成功しているならデータを取り出している部分をデバッグしましょう。
olee46

2017/06/08 11:02

c.moveToFirstがfalseを返しているので、どうやらテーブルが空のようです。別々のactivityでデータベースを操作しているせいかと思いましたが、こちらのサンプルコードでは動くので、原因がわかりません。 http://www.sakc.jp/blog/archives/21645
yona

2017/06/08 12:10

おそらく別のアクティビティとかは関係ないです。 どこかで何かを間違っているようです。 SQLiteDatabase#rawQueryを使って「select * from default_tb」を実行して結果を確認してください。
olee46

2017/06/08 23:42

rawQueryを実行してみましたが、結果は同じでした
olee46

2017/06/08 23:56

AddActivity側でデータベースを表示させみたのですが、こちらでは反映されていました…
olee46

2017/06/09 00:08

さらに追記ですが、データベースを表示させたところ、追加したレコード一つしか表示されませんでした
yona

2017/06/09 05:56

同じデータベースを見ているんですよね? MyDBHelperを質問に追記してください。
olee46

2017/06/14 04:44

遅くなりましたが追記しました。
yona

2017/06/14 04:58

コンストラクタの第二引数でデータベース名を指定しない場合はメモリ上にデータベースが作成されて、データベースを閉じたタイミングで消えてしまいますよ。
olee46

2017/06/15 04:08

解決しました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問