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

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

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

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

Android

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

Android Studio

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

Kotlin

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

Q&A

0回答

1017閲覧

Realmのデータをすべて取得して、既存のデータを更新するときに重複していないか確認したい

退会済みユーザー

退会済みユーザー

総合スコア0

Realm

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

Android

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

Android Studio

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

Kotlin

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

0グッド

0クリップ

投稿2021/11/11 00:38

編集2021/11/11 00:41

前提・実現したいこと

Androidstudioでkotlinを触り始めて三か月の初心者です。

Realmからデータを取得して、既存のデータを更新するときに、データが重複していないか確認したいです。もし重複していたらアラートダイアログで「重複しています」みたいな表示をし、重複していなかったらそのままデータを更新したいです。

現在作成しているアプリは、IDと名前と年齢を登録するアプリで、今のところ、追加・更新・削除はできました。更新するときに条件を加えると(登録済みのデータを取得して、更新するデータと既存のデータが同じ場合は×)アプリがクラッシュしてしまいます。

ログキャットを見てみるとNullPointerExceptionと書いてありましたが、調べてもなかなか理解できません。

説明が下手なので申し訳ありません。

どなたかご教授お願いします。

発生している問題・エラーメッセージ

エラーは発生していないのですが、アプリがクラッシュする

該当のソースコード

kotlin

1 realm = Realm.getDefaultInstance() 2 3 bt_add.setOnClickListener { 4 if (et_id.text.isEmpty() && et_name.text.isEmpty() && et_age.text.isEmpty()){ 5 return@setOnClickListener 6 } 7 8 realm.beginTransaction() 9 var count = 0 10 realm.where(user::class.java).findAll().let { 11 for (Id in it){ 12 count++ 13 } 14 } 15 16 try { 17 var user = realm.createObject(user::class.java) 18 user.setID(count) 19 user.setName(et_name.text.toString()) 20 user.setAge(et_age.text.toString()) 21 tv_id.text = user.getID().toString() 22 tv_name.text = user.getName() 23 tv_age.text = user.getAge() 24 et_id.text.clear() 25 et_name.text.clear() 26 et_age.text.clear() 27 realm.commitTransaction() 28 Toast.makeText(applicationContext,"登録しました",Toast.LENGTH_SHORT).show() 29 }catch (e:RealmException){} 30 } 31 32 bt_read.setOnClickListener { 33 if (et_name.text.isEmpty()){ 34 return@setOnClickListener 35 } 36 realm.beginTransaction() 37 val user = realm.where<user>().equalTo("name",et_name.text.toString()).findFirst() 38 if ( user!!.getName() == et_name.text.toString()){ 39 Toast.makeText(applicationContext,"aaa",Toast.LENGTH_SHORT).show() 40 } 41 realm.commitTransaction() 42 et_id.text.clear() 43 et_name.text.clear() 44 et_age.text.clear() 45 tv_read.setText(user.toString()) 46 } 47 48 bt_update.setOnClickListener { 49 if (et_id.text.isEmpty() && et_name.text.isEmpty()){ 50 return@setOnClickListener 51 } 52 realm.beginTransaction() 53 val okueall = realm.where(user::class.java).equalTo("name",et_name.text.toString()).findFirst() 54 if ( okueall!!.getName() == et_name.text.toString()){ 55 AlertDialog.Builder(this) 56 .setTitle("使用不可") 57 .setMessage("登録済み") 58 .setPositiveButton("Ok",null) 59 .show() 60 }else{ 61 realm.where(user::class.java).equalTo("id",et_id.text.toString().toInt()).findFirst().let { 62 it!!.setName(et_name.text.toString()) 63 it!!.setAge(et_age.text.toString()) 64 et_id.text.clear() 65 et_name.text.clear() 66 et_age.text.clear() 67 Toast.makeText(applicationContext, "更新しました", Toast.LENGTH_SHORT).show() 68 realm.commitTransaction() 69 } 70 } 71 } 72 73 bt_delete.setOnClickListener { 74 AlertDialog.Builder(this) 75 .setTitle("登録情報の削除") 76 .setMessage("登録情報を削除しますか?") 77 .setPositiveButton("削除" , { dialog , which -> 78 realm.beginTransaction() 79 val delete = realm.where<user>().findAll() 80 delete.deleteAllFromRealm() 81 realm.commitTransaction() 82 et_id.text.clear() 83 et_name.text.clear() 84 et_age.text.clear() 85 Toast.makeText(applicationContext,"削除しました", Toast.LENGTH_SHORT).show() 86 }) 87 .setNegativeButton("キャンセル" , { dialog , which -> 88 Toast.makeText(applicationContext,"キャンセルしました", Toast.LENGTH_SHORT).show() 89 }).show() 90 } 91 } 92}

試したこと

条件を追加せずに更新した場合は正常に動作します。
ifで条件を追加するとアプリがクラッシュします
bt_updataのとこが怪しいと思っております。

補足情報(FW/ツールのバージョンなど)

Android Studio Arctic Fox | 2020.3.1 Patch 1

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

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

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

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

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

jimbe

2021/11/11 04:37

> ログキャットを見てみるとNullPointerExceptionと書いてありました その全文をご提示ください。 また、"どの行で" それが発生しているのかを教えてください。
退会済みユーザー

退会済みユーザー

2021/11/11 05:00

jimbe様 回答有難うございます。 発生している場所は下記に記載します。 if ( okueall!!.getName() == et_name.text.toString()){ bt_updataのとこになります。 ログキャットの内容は下記になります。 2021-11-11 13:42:42.019 24596-24596/com.example.id_name_age_realm E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.id_name_age_realm, PID: 24596 java.lang.NullPointerException at com.example.id_name_age_realm.MainActivity.onCreate$lambda-5(MainActivity.kt:96) at com.example.id_name_age_realm.MainActivity.$r8$lambda$7y3UiTsaQ2pC7d7__RIrYgIt4iY(Unknown Source:0) at com.example.id_name_age_realm.MainActivity$$ExternalSyntheticLambda3.onClick(Unknown Source:8) at android.view.View.performClick(View.java:6602) at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119) at android.view.View.performClickInternal(View.java:6579) at android.view.View.access$3100(View.java:783) at android.view.View$PerformClick.run(View.java:25937) at android.os.Handler.handleCallback(Handler.java:873) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6894) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:883)
jimbe

2021/11/11 05:10

> 発生している場所 ~ その if 文が怪しいのでしたら、そこで使っている各変数・フィールドが null になっていないかを確認されては如何でしょう。
退会済みユーザー

退会済みユーザー

2021/11/11 05:37

これは(okueall!!)がnullの可能性があるということでしょうか? 初心者でほとんど真似してコードを書いているので、ある程度は分かるのですが、なんとなくくらいしか理解できていない状況です。 私の認識ですと、まずフィールド"name"にデータを追加して(そこの確認はrealmstudioで確認済みです)、そこからエディットテキストに登録していない名前を入力して、更新ボタンを押すとアプリがクラッシュする状態です。
jimbe

2021/11/11 06:52

例外のメッセージはラムダ式を指していて直接どの変数が null なのかは確認出来ません。 言わば、ダイイングメッセージに直接犯人の名前は書かれていないという状況です。 とすれば、それに関係する容疑者を調べるしかありません。 表示された行番号の行(もしくは周辺)で使っている変数(もしくは式)で null になっているものは無いか、ということです。 > これは(okueall!!)がnullの可能性があるということでしょうか? と聞かれても、では「nullの可能性は絶対無い」と言える根拠はあるのでしょうか。私には根拠がありませんので、"白" で無いなら調べます。 刑事ドラマなら、関係者のアリバイ調べは当然でしょう。「あの人はそんなことをする人じゃないからアリバイ調べなんてしない」なんてしたら、手抜き捜査ではありませんか?
退会済みユーザー

退会済みユーザー

2021/11/11 06:58

jimbe様 回答有難うございます。 確かにjimbe様の言う通りです。もう少しnullになっている箇所と原因を調べます! たくさんの回答有難うございます。
hoshi-takanori

2021/11/11 07:50

データをすべて取得して自分で重複をチェックするのは無駄だと思います。ID で検索して取得できたらそれを更新、なければ新規作成すれば良いのでは。
jimbe

2021/11/11 10:04

> ID で検索して取得できたら ~ bt_update の部分はそれに近い(id でなく name ですが) 感じにされようとしているようです。
退会済みユーザー

退会済みユーザー

2021/11/11 23:30

hoshi-takanori様 jimbe様 回答有難うございます。 説明が足りなく申し訳ありません。 予め、IDと名前と年齢を登録して、新たにそれらを登録する際に、同じ名前を登録しようとした時にアラートダイアログで知らせるというようなアプリを作ろうと考えております。 よくグーグルアカウントなどの、ID登録する際に「このIDは使えません」のようなイメージです。
退会済みユーザー

退会済みユーザー

2021/11/12 00:09

jimbe様 hoshi-takanori様 たくさんの回答有難うございます。 jimbe様が昨日おっしゃっていたように,nullがチェックしたところ、[okueall]がnullでした。 これが原因かなと私は考えております。なぜnullなのかはまだ分かりませんが、もう少し調べてみます。 ちなみにnullチェックしたのは以下のコードになります。初心者なので正しく出来ているかは分かりませんが、出来る限りやってみました。 bt_null.setOnClickListener { realm.beginTransaction() var okue_all = realm.where(user::class.java).equalTo("name",et_name.text.toString()).findFirst() if (okue_all == null){ Toast.makeText(applicationContext,"nullです",Toast.LENGTH_SHORT).show() realm.commitTransaction() } }
退会済みユーザー

退会済みユーザー

2021/11/12 00:39

jimbe様 hoshi-takanori様 たくさんの回答有難うございます。 おっしゃていた通りにnullチェックをして、nullかnullではないの判断をするとやりたいことが出来るようになりました! 本当に有難うございました。まだまだ初心者ですが、エンジニアに転職を考えておりますので、これからも頑張ります。 これからもどうが宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問