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

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

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

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Android Studio

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

Q&A

解決済

1回答

2666閲覧

データベース(Realm)で、削除時に”本当に削除しますか?"と聞き”YES/NO”を選択できるようにしたい

sakanasann

総合スコア11

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Android Studio

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

0グッド

0クリップ

投稿2016/09/29 05:04

編集2016/09/30 02:30

書籍のサンプルソースを改造しようとしています。
書籍のサンプルソースでは削除ボタンを押すとそのまま削除されてしまい、誤操作の危険性があるためタイトルのような処理を追加したいと思い、別のサンプルを改良したものを作成しそれと組み合わせようと考えました。
しかし、どう組み合わせれば正常に動くかわからずいろいろと試してみたのですが一向に正常に動きません。
もちろん、それぞれ単独では正常に動作します。
本来ならば時間をかけて勉強しエラーの対処にあたりたいのですが、諸事情によりあまり時間をとれなくなってしまったため、質問することとしました。
おそらくは、かなり初歩的なミスも多いのかと思われますがよろしくお願いします。

開発環境はAndroidStudioです。
Java言語での開発、Androidstudioの利用、Realmの利用は今回が初めてです。
エラー文の意味はおおざっぱには理解できたのですが、それをどうすれば解決できるのかがわかりません。

なお、teratailの利用も今回が初めてですので、その点についても気になるところがありましたらご指摘くださるとありがたいです。

↓書籍の削除処理部分のソースコード
ScheduleEditActivityクラス内に記述されています

Java

1public void onDeleteTapped(View view) { 2 long scheduleId = getIntent().getLongExtra("schedule_id", -1); 3 if (scheduleId != -1) { 4 Realm realm = Realm.getInstance(this); 5 RealmResults<Schedule> results = realm.where(Schedule.class) 6 .equalTo("id", scheduleId).findAll(); 7 realm.beginTransaction(); 8 results.remove(0); 9 realm.commitTransaction(); 10 Toast.makeText(this, "削除しました", Toast.LENGTH_SHORT).show(); 11 } 12 finish(); 13 }

↓サンプルソースをもとに改良したソースコード
YESボタンを押すと”削除しました”と表示
NOボタンを押すと”キャンセルしました”と表示
この時点では上下のソースのものとは別のプロジェクトです。
MainActivityクラス内に記述しています

Java

1protected void onCreate(Bundle savedInstanceState) { 2 super.onCreate(savedInstanceState); 3 AlertDialog.Builder alert = new AlertDialog.Builder(this); 4 alert.setMessage("本当に削除しますか?"); 5 alert.setPositiveButton("No", new DialogInterface.OnClickListener(){ 6 public void onClick(DialogInterface dialog, int which) { 7 //Noボタンが押された時の処理 8 Toast.makeText(MainActivity.this, "キャンセルしました", Toast.LENGTH_LONG).show(); 9 }}); 10 alert.setNegativeButton("Yes", new DialogInterface.OnClickListener(){ 11 public void onClick(DialogInterface dialog, int which) { 12 //Yesボタンが押された時の処理 13 Toast.makeText(MainActivity.this, "削除しました", Toast.LENGTH_LONG).show(); 14 }}); 15 alert.show(); 16 }

この2つを組み合わせて、削除時に”本当に削除しますか?”と聞き、YESを押せば削除する。NOを押せばキャンセルするようにしたいです。

↓自分で試してみた結果、エラーが出ました。
先ほどの「書籍の削除処理部分のソースコード」に「サンプルソースをもとに改良したソースコード 」を書き加える形になっています
ScheduleEditActivityクラス内に記述しています

Java

1public void onDeleteTapped(View view) { 2 super.onCreate(savedInstanceState); 3 AlertDialog.Builder alert = new AlertDialog.Builder(this); 4 alert.setMessage("本当に削除しますか?"); 5 alert.setPositiveButton("No", new DialogInterface.OnClickListener(){ 6 public void onClick(DialogInterface dialog, int which) { 7 //Noボタンが押された時の処理 8 Toast.makeText(MainActivity.this, "キャンセルしました", Toast.LENGTH_LONG).show(); 9 }}); 10 alert.setNegativeButton("Yes", new DialogInterface.OnClickListener(){ 11 public void onClick(DialogInterface dialog, int which) { 12 //Yesボタンが押された時の処理 13 long scheduleId = getIntent().getLongExtra("schedule_id", -1); 14 if (scheduleId != -1) { 15 Realm realm = Realm.getInstance(this); 16 RealmResults<Schedule> results = realm.where(Schedule.class) 17 .equalTo("id", scheduleId).findAll(); 18 realm.beginTransaction(); 19 results.remove(0); 20 realm.commitTransaction(); 21 Toast.makeText(this, "削除しました", Toast.LENGTH_SHORT).show(); 22 } 23 }}); 24 alert.show(); 25 finish(); 26 }

エラー文は以下の通りです。

Error:(99, 24) エラー: シンボルを見つけられません
シンボル: 変数 savedInstanceState
場所: クラス ScheduleEditActivity

Error:(105, 44) エラー: MainActivityは内部クラスを囲みません

Error:(112, 40) エラー: getInstanceに適切なメソッドが見つかりません(<anonymous OnClickListener>)
メソッド Realm.getInstance(Context)は使用できません
(引数の不一致: <anonymous OnClickListener>をContextに変換できません:)
メソッド Realm.getInstance(RealmConfiguration)は使用できません
(引数の不一致: <anonymous OnClickListener>をRealmConfigurationに変換できません:)

どうすればよいでしょうか?

-----追記-----
↓指摘部分と、その他一部を修正しました。
変更部分:
・「super.onCreate(savedInstanceState);」を削除
・「this」を「getBaseContext()」に変更
・「Toast.makeText(MainActivity.this, "キャンセルしました", Toast.LENGTH_LONG).show();」を
「Toast.makeText(getBaseContext(), "キャンセルしました", Toast.LENGTH_LONG).show();」に変更

Java

1public void onDeleteTapped(View view) { 2 AlertDialog.Builder alert = new AlertDialog.Builder(this); 3 alert.setMessage("本当に削除しますか?"); 4 alert.setPositiveButton("No", new DialogInterface.OnClickListener(){ 5 public void onClick(DialogInterface dialog, int which) { 6 //Noボタンが押された時の処理 7 Toast.makeText(getBaseContext(), "キャンセルしました", Toast.LENGTH_LONG).show(); 8 }}); 9 alert.setNegativeButton("Yes", new DialogInterface.OnClickListener(){ 10 public void onClick(DialogInterface dialog, int which) { 11 //Yesボタンが押された時の処理 12 long scheduleId = getIntent().getLongExtra("schedule_id", -1); 13 if (scheduleId != -1) { 14 Realm realm = Realm.getInstance(getBaseContext()); 15 RealmResults<Schedule> results = realm.where(Schedule.class) 16 .equalTo("id", scheduleId).findAll(); 17 realm.beginTransaction(); 18 results.remove(0); 19 realm.commitTransaction(); 20 Toast.makeText(getBaseContext(), "削除しました", Toast.LENGTH_SHORT).show(); 21 } 22 }}); 23 alert.show(); 24 finish(); 25 }

エラーはでなくなったものの、AlertDialog画面が表示後すぐに閉じてしまうようになりました。
削除処理はされておらず、トーストも表示されていません。

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

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

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

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

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

guest

回答1

0

ベストアンサー

super.onCreate(savedInstanceState);

は不要です。これは、参考になさった onCreate 独自のものなので onDeleteTapped で呼び出すことは出来ません。

あと、Realmを操作するところですが、それ自体をMainActivity内のローカルな関数にしておき、それを呼び出すようにしてみたらどうでしょうか?

投稿2016/09/29 08:11

PineMatsu

総合スコア3579

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

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

sakanasann

2016/09/30 01:28

指摘部分とその他一部を修正しました。 「this」を「getBaseContext()」に変更するとエラーが消えたという記事を見つけ試してみたところ、エラーは消えたもののYES/NOの選択をする前に閉じてしまうようになりました。 削除処理はされておらず、トーストも表示されていません。 まずは現状で正常に動作させたいので、ローカルな関数にするかどうかは後程決めたいと思います。
PineMatsu

2016/09/30 01:43

thisが何を指すかということですね。ローカルな関数にするということは、thisはMainActivityを指すはず。しかし、AlertDialogの中に書いてしまうとthisはAlertDialogを指すことになります。 中に書く場合は、getBaseContext()ではなくgetActivity()でないといけないじゃないかな?
sakanasann

2016/10/01 08:45

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問