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

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

ただいまの
回答率

89.99%

1レコードを削除するボタンを作成したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,021

asdfhorse

score 11

RealmにUUIDをプライマリーキーにしたデータを入れています。
そのUUIDでランダムに作ったキーを元に削除処理をしたいのですが、IDの取得方法がわかりません。
下の画像の赤線のデータをゴミ箱ボタンを押したら削除したいです。
どなたかご教授お願いします。

open class Kakeibo : RealmObject() {
        @PrimaryKey
        var shushiId: String? = null
        var date: String? = null
        var money: Int = 0
        var shuushi: String? = null
        var genre: String? = null
}
package com.example.user.kakeiboapplication

import android.content.Context
import android.graphics.BitmapFactory
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.util.Log
import android.widget.EditText
import android.widget.ListView
import com.example.syouziaitomonori.kakeiboapplication.R.string.calendar
import io.realm.Realm
import io.realm.RealmConfiguration
import io.realm.kotlin.createObject
import io.realm.kotlin.where
import java.util.*

class MainActivity : AppCompatActivity() {
    private lateinit var realm: Realm

    private fun initRealm() {
        val realmConfiguration = RealmConfiguration.Builder()
            .deleteRealmIfMigrationNeeded()
            .schemaVersion(0)
            .build()
        realm = Realm.getInstance(realmConfiguration)

    }

    override fun onCreate(savedInstanceState: Bundle?) {
        Realm.init(this)

        realm = Realm.getDefaultInstance()
        realm.executeTransaction() {
            val delete = realm.where<Kakeibo>().contains("shushiId" , "").findAll()
            delete.deleteAllFromRealm()
        }

        realm.beginTransaction()

        realm.createObject<Kakeibo>(UUID.randomUUID().toString()).apply {
            date = "11/14"
            money = 1000
            shuushi = "支出"
            genre = "食費"
        }
        realm.commitTransaction()

        var listView: ListView
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        listView = findViewById(R.id.kakeibolist)
        val Kakeibo = realm.where<Kakeibo>().findAll()
        listView?.adapter = KakeiboAdapter(Kakeibo)
    }


        override fun onDestroy() {
            super.onDestroy()
            realm.close()
        }
    }
package com.example.user.kakeiboapplication

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.ListView
import android.widget.TextView
import io.realm.OrderedRealmCollection
import io.realm.Realm
import io.realm.RealmBaseAdapter
import io.realm.RealmConfiguration

open class KakeiboAdapter (data: OrderedRealmCollection<Kakeibo>?) : RealmBaseAdapter<Kakeibo>(data) {
    private lateinit var mRealm: Realm


    inner class ViewHolder(cell: View) {
        var kakeiboDate = cell.findViewById<TextView>(R.id.item_date)
        var kakeiboMoney = cell.findViewById<TextView>(R.id.item_money)
        var kakeiboShushi = cell.findViewById<TextView>(R.id.item_shushi)
        var kakeiboGenre = cell.findViewById<TextView>(R.id.item_genre)
        var deleteicon: ImageView = cell.findViewById(R.id.delete_button)
    }

    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {

        val view: View
        var viewHolder: ViewHolder? = null
        mRealm = Realm.getDefaultInstance()


        when (convertView) {
            null -> {
                val inflater = LayoutInflater.from(parent?.context)
                view = inflater.inflate(R.layout.kakeibolist, parent, false)
                viewHolder = ViewHolder(view)
                view.tag = viewHolder
            }
            else -> {
                view = convertView
                viewHolder = view.tag as ViewHolder
            }
        }

        adapterData?.run {
            val Kakeibo = get(position)
            viewHolder.kakeiboDate.text = Kakeibo.date
            viewHolder.kakeiboMoney.text = Kakeibo.money.toString()
            viewHolder.kakeiboShushi.text = Kakeibo.shushi
            viewHolder.kakeiboGenre.text = Kakeibo.genre
            //     viewHolder.recipeImage.setImageBitmap(Recipe.recipeImage)
            viewHolder.kakeiboDate.setPadding(0, 50, 0, 0)
            viewHolder.kakeiboMoney.setPadding(500, 100, 0, 0)
            viewHolder.kakeiboShushi.setPadding(500, 30, 0, 0)
            viewHolder.kakeiboGenre.setPadding(800, 50, 0, 0)

            val listItem = getItem(position)
            viewHolder.kakeiboDate.text = listItem!!.date
            viewHolder.kakeiboShushi.text = listItem.shushi
            viewHolder.kakeiboMoney.text = listItem.money.toString()
            viewHolder.kakeiboGenre.text = listItem.genre
            mRealm.beginTransaction()
            viewHolder.deleteicon.setOnClickListener(){
                var key = mRealm.where(Kakeibo::class.java)
                    .equalTo("shushiId", listItem?.shushiId).findAll()
                mRealm.executeTransaction {
                    key.deleteAllFromRealm()
                    notifyDataSetChanged()
                }
            }
            mRealm.commitTransaction()
            }
            return view!!
        }
    }


![イメージ説明](04a298ca0dd1e220c8e0c04c6d46b76b.png)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

こちらのサイトが参考になると思います。

上記サイトのMainActivity.kt内のMyArrayAdapterのように
KakeiboAdapterでgetView()メソッドをオーバーライドしてください。

上記サイトのMainActivity.ktの76行目

val listItem = getItem(position)


で対象のRealmObjectが取得できるのでそこからUUIDが取得できるはずです。

実際に試してはいないので出来なかったらコメントしてください。

-追記-
コードを記載したかったので本文に追記します。
私が例としてお見せしたサイトはRealmを使っていないため単純にremoveでよいのですが、質問者さんの場合はそうではありません。私が例としてあのサイトをお見せしたのは、

viewHolder.deleteicon.setOnClickListener {}


に削除ボタンを押したときの処理を書けばよいという事を伝えるためです。

つまり質問者さんの場合は
this.remove(listItem)を「Realmからデータを削除する処理」に変える必要があります。
初めにlistItemからRealmObjectを取得してそこからUUIDが取れますといったのはそこで使うためです。回りくどいことを言いましたが単純にKakeiboAdapterでrealmを使えるようにしてあげてviewHolder.deleteicon.setOnClickListener {}に

mRealm.executeTransaction {
   mRealm.where(Kakeibo::class.java)
     .equalTo("shushiId",listItem?.shushiId)
     .findAll()
     .deleteAllFromRealm()
}


を記載すればRealmからレコードを削除することができます。
レコードを削除したら例のサイトと同じように notifyDataSetChanged()
でListViewを更新すればOKです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/26 10:42

    返信遅くなって申し訳ありません。
    削除後の更新処理がうまくできず、画面遷移など行って再度読み込みすると削除したはずのデータがまだ残っている状態です。本文のKakeiboAdapterを更新しました。

    キャンセル

  • 2018/11/26 11:12 編集

    ぱっと見削除処理は問題ないように思います。気になる点としては削除処理のトランザクションの張り方ですが、executeTransaction()を使うとbeginTransaction()とcommitTransaction()を勝手にやってくれるのでexecuteTransaction()の上下のbeginTransaction()とcommitTransaction()は必要ないです。データが復活してしまう原因には関係ないと思いますが・・・。
    私の環境では削除されていることを確認できています。どう画面遷移しているかにもよりますが、もしかしたら画面遷移時にMainActivity のonCreate()が呼ばれて再度インサートしてたりしませんか?ブレークポイント置いて確認してみてください。
    画面遷移の処理を載せてもらえればこっちでも動かしてみます。

    キャンセル

  • 2018/11/27 11:04

    指摘していただいた通り、家計簿の画面に遷移するたびにonCreate()の中のCreateObjectが呼ばれてデータが増えていました。ボタンを押したときにCreateObjectの処理を呼ぶように修正したら解決しました。
    丁寧かつ親切に教えていただいてありがとうございました!助かりました!

    キャンセル

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

  • ただいまの回答率 89.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる