SQLiteOpenHelperを継承したCustomOpenHelperを使って、
日付ごとにメモを登録しようとしているのですが、
データの検索、更新がうまくいっておりません。
String型のdisplayをキーにして、
MemoActivityの生成と同時にデータ検索、表示、
onUpdateメソッドでデータの追加、更新をしようとしています。
データ更新時、onUpdateメソッドのtryまで、
変数が正しく入っており、アプリが落ちたりもしません。
Toastの表示も正常に動作しております。
しかし、再度アクティビティーを生成するとデータが登録されていないことを判明します。
データベースの登録、検索を正常にする方法を教えていただければ幸いです。
Android Studio:3.6.1
build:grandle:3.6.3
java
1 2import androidx.appcompat.app.AppCompatActivity; 3 4import android.content.Context; 5import android.content.Intent; 6import android.os.Bundle; 7import android.view.Gravity; 8import android.view.LayoutInflater; 9import android.view.View; 10import android.view.ViewGroup; 11import android.view.inputmethod.InputMethodManager; 12import android.widget.Button; 13import android.widget.EditText; 14import android.widget.ImageView; 15import android.widget.LinearLayout; 16import android.widget.TextView; 17import android.widget.Toast; 18 19import java.util.Calendar; 20 21import datebase.CustomOpenHelper; 22 23public class MemoActivity extends AppCompatActivity implements View.OnClickListener{ 24//EditTextを生成 25EditText editText; 26//データベース 27CustomOpenHelper customOpenHelper; 28//表示する日付 29String display; 30//表示する年月日 31int displayYear; 32int displayMonth; 33int displayDay; 34 35TextView textView; 36//Calendarクラス 37Calendar calendar = null; 38@Override 39protected void onCreate(Bundle savedInstanceState) { 40super.onCreate(savedInstanceState); 41setContentView(R.layout.activity_memo); 42 43//MainActivityからインテントを取得 44Intent intent = this.getIntent(); 45//値を取得 46String year = intent.getStringExtra("year"); //年 47String month = intent.getStringExtra("month"); //月 48String day = intent.getStringExtra("day"); 49//表示する文字列を作成 50display = year+"年"+month+"月"+day+"日"; 51 52//文字列を登録 53displayYear = Integer.parseInt(year); 54displayMonth = Integer.parseInt(month); 55displayDay = Integer.parseInt(day); 56 57//CalendarMakerの生成 58this.calendar = Calendar.getInstance(); 59calendar.set(displayYear,displayMonth,displayDay); 60 61//画面に表示 62textView = ((TextView)findViewById(R.id.year_month_day)); 63textView.setText(display); 64 65//EditTextを生成 66editText = findViewById(R.id.memo); 67//Focusの設定 68editText.setOnFocusChangeListener(new View.OnFocusChangeListener(){ 69@Override 70public void onFocusChange(View v, boolean hasFocus) { 71//EditTextのフォーカスが外れた場合 72if(!hasFocus){ 73//ソフトキーボードを非表示にする 74InputMethodManager imm = (InputMethodManager) 75getSystemService(Context.INPUT_METHOD_SERVICE); 76 77imm.hideSoftInputFromWindow(v.getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS); 78} 79} 80}); 81LinearLayout linearLayout = ((LinearLayout)findViewById(R.id.layout)); 82linearLayout.setOnClickListener(this); 83 84//データベースを生成する 85this.customOpenHelper = new CustomOpenHelper(this); 86 87//EditTextに文字列をセットする 88String memo = customOpenHelper.getPlan(display); 89editText.setText(memo); 90} 91//EditTextに入力された文字列を取得する 92public void onUpdate(View v){ 93//EditTextのテキストを取得 94String text = editText.getText().toString(); 95//メモに入力がなかった場合 96if(text.equals("")){ 97ImageView imageView = new ImageView(this); 98imageView.setImageResource(R.drawable.no); 99Toast toast = new Toast(this); 100toast.setDuration(Toast.LENGTH_SHORT); 101toast.setView(imageView); 102toast.setGravity(Gravity.CENTER,0,0); 103toast.show(); 104}else{//メモに入力があった場合 105//データベースに登録する 106this.customOpenHelper.addMemo(display,text); 107Toast toast = new Toast(this); 108toast.makeText(this,"登録しました",Toast.LENGTH_SHORT).show(); 109} 110} 111//日付を前にずらす 112public void onPrevious(View v){ 113this.calendar.add(Calendar.DAY_OF_MONTH,-1); 114this.getDate(); 115String date = displayYear+"年"+displayMonth+"月"+displayDay+"日"; 116textView.setText(date); 117} 118//日付を後ろにずらす 119public void onNext(View v){ 120this.calendar.add(Calendar.DAY_OF_MONTH,1); 121this.getDate(); 122String date = displayYear+"年"+displayMonth+"月"+displayDay+"日"; 123textView.setText(date); 124} 125//戻るボタン"" 126public void onDelete(View v){ 127//アクティビティーの破棄 128finish(); 129} 130@Override 131public void onClick(View v) { 132//ボタンにフォーカスを移動させる 133Button button = ((Button)findViewById(R.id.update)); 134button.setFocusable(true); 135button.setFocusableInTouchMode(true); 136button.requestFocus(); 137} 138//年月日の取得 139private void getDate(){ 140this.displayYear = calendar.get(Calendar.YEAR); 141this.displayMonth = calendar.get(Calendar.MONTH); 142this.displayDay = calendar.get(Calendar.DATE); 143} 144}
java
1import android.content.ContentValues; 2import android.content.Context; 3import android.database.Cursor; 4import android.database.sqlite.SQLiteDatabase; 5import android.database.sqlite.SQLiteOpenHelper; 6 7 8public class CustomOpenHelper extends SQLiteOpenHelper { 9 //データベースの名前 10 private static final String DB_NAME ="calendar"; 11 //バージョン管理 12 private static final int DB_VERSION = 1; 13 //テーブル作成SQL 14 private static final String CREATE_TABLE_MESSAGES =""+ 15 "CREATE TABLE calendar("+ 16 "date TEXT PRIMARY KEY,"+ 17 "memo TEXT"+ 18 ")"; 19 //データベース 20 private SQLiteDatabase db = null; 21 22 public CustomOpenHelper(Context context){ 23 super(context,DB_NAME,null,DB_VERSION); 24 } 25 26 @Override 27 public void onCreate(SQLiteDatabase db) { 28 //テーブル作成 29 db.execSQL(CREATE_TABLE_MESSAGES); 30 } 31 32 @Override 33 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 34 35 } 36 //メモを保存する 37 public void addMemo(String date,String memo){ 38 //メモを取得 39 String addOrUpdate = this.getMemo(date); 40 this.db = this.getWritableDatabase(); 41 //ContentValuesにデータを入れる 42 ContentValues val = new ContentValues(); 43 val.put("date",date); 44 val.put("memo",memo); 45 try{ 46 //メモの登録がされていなかった場合 47 if(addOrUpdate.equals("")){ 48 //メモを追加する 49 db.insert(this.DB_NAME,null,val); 50 }else{ 51 //メモを更新する 52 db.update(this.DB_NAME,val,"date = ?",new String[]{memo}); 53 } 54 }finally { 55 db.close(); 56 } 57 } 58 //メモを返す 59 public String getPlan(String date){ 60 return this.getMemo(date); 61 } 62 //データが保存してあるかを確認する 63 private String getMemo(String date){ 64 //返すmemoの箱 65 String memo = ""; 66 //読み込み用のデータベース 67 this.db = this.getReadableDatabase(); 68 try{ 69 String sql = ""; 70 Cursor cursor = db.query( 71 this.DB_NAME, 72 new String[]{"memo"}, 73 "date == ?", 74 new String[]{"memo"}, 75 null,null,null,null 76 ); 77 //データが存在する場合 78 if(cursor.moveToFirst()){ 79 memo = cursor.getString(0); 80 } 81 }finally { 82 db.close(); 83 } 84 return memo; 85 } 86 87 public SQLiteDatabase getDb() { 88 return db; 89 } 90}
回答2件
あなたの回答
tips
プレビュー