前提・実現したいこと
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
あなたの回答
tips
プレビュー