やりたいこと
MongoDB Realm(データベース)側で更新したものをリアルタイムで更新したい!
今できていること
現在、Androidアプリでデータベース(MongoDB)と同期を行い下のようにグラフに反映させています。*載せてある情報は自転車の対気速度と回転数です
問題点
MongoDB側では以下のようなコレクション構成になっており、
Android アプリでは以下のような表示になっています。
MongoDB側のsonsornameでどのデータを取得するかを判別して、下のrpmでその値を取得するというものです。
*速度の場合はsensornameがSPEEDになっており、値格納場所はspeedになっています。
ここでMongoDBのrpmを以下のように変更します。
すると、Android app側では
となり、値が変更されません。画面を横に向けて横画面にして、元に戻すと下のように値が反映されます。
このような操作をせずに値をリアルタイムで反映させたいです。
コード
使用したコードです。必要があればその他のコード、レイアウトファイルも追記します。
MainActivity.kt
kotlin
1package com.mongodb.mariaver02//パッケージ名 2 3import androidx.appcompat.app.AppCompatActivity 4import android.os.Bundle 5import android.util.Log 6import android.content.Intent 7import android.widget.LinearLayout 8import android.widget.TextView 9import com.mongodb.mariaver02.model.Cloud 10import io.realm.Realm 11import io.realm.RealmQuery 12import io.realm.kotlin.where 13import io.realm.mongodb.User 14import io.realm.mongodb.sync.SyncConfiguration 15import java.lang.IllegalStateException 16import io.realm.Sort 17//UIに関するインポート 18import android.widget.RadioGroup 19import com.github.mikephil.charting.charts.BarChart 20import com.github.mikephil.charting.charts.CandleStickChart 21import com.github.mikephil.charting.charts.LineChart 22import com.github.mikephil.charting.charts.PieChart 23import com.github.mikephil.charting.data.BarEntry 24import com.github.mikephil.charting.data.Entry 25import com.mongodb.mariaver02.model.TaskAdapter//作っただけで使ってません 26//チャートモデルインポート 27import com.mongodb.mariaver02.chart.* 28import java.text.SimpleDateFormat 29import java.util.* 30import android.content.Context 31import android.graphics.Color 32import kotlinx.android.synthetic.main.activity_main.* 33import android.view.Menu 34import android.view.MenuItem 35 36class MainActivity : AppCompatActivity() { 37 private lateinit var realm: Realm //Realmデータベースのインスタンス 38 private var user: User? = null 39 private lateinit var queryTextView: TextView//クエリ結果表示用のテキストViewインスタンス 40 private lateinit var adapter: TaskAdapter//作っただけで使ってません 41 42 override fun onStart() { 43 super.onStart() 44 try { 45 user = maria.currentUser() 46 } catch (e:IllegalStateException) { 47 Log.w(TAG(), e) 48 } 49 if (user == null) { 50 startActivity(Intent(this,LoginActivity::class.java)) 51 } 52 else { //この部分にログイン後の処理書きこみ 53 //折れ線グラフ表示(単線) 54 //refreshSingleLineChart(this, findViewById(R.id.lineChartExample)) 55 //円グラフの表示 56 //Mongodb Realmとの同期設定 57 val partitonValue: String = "パーティション名" 58 val config = SyncConfiguration.Builder(user!!,"パーティション名") 59 .waitForInitialRemoteData() 60 .build() 61 62 //上記設定をデフォルトとして保存 格納先config 63 Realm.setDefaultConfiguration(config) 64 //非同期バックグラウンド処理でMongodb Realmと同期実行 65 Realm.getInstanceAsync(config, object : Realm.Callback() { 66 override fun onSuccess(realm: Realm) { 67 this@MainActivity.realm = realm 68 69 //val AirDire = realm.where<Sensor>().sort("no01_AirDirection") 70 // val sensorQuery = realm.where<Sensor>() 71 val result = realm.where<Cloud>().findAll() 72 var rpm_ori = 0 73 var speed_ori = 0 74 var rpm = 0 75 var speed = 0 76 //DESCENDINGは上から下にかけてデータを探すASCEENDINGは上から下にかけてデータを探す 77 refreshPieChart(this@MainActivity, findViewById(R.id.rpm), realm) 78 refreshPieChart(this@MainActivity, findViewById(R.id.speed), realm) 79 80 } 81 }) 82 83 } 84 85 } 86 87 88 override fun onCreate(savedInstanceState: Bundle?) { 89 super.onCreate(savedInstanceState) 90 setContentView(R.layout.activity_main) 91 92 realm = Realm.getDefaultInstance() 93 //queryTextView = findViewById(R.id.query) 94 95 } 96 97 override fun onDestroy() { 98 super.onDestroy() 99 // if a user hasn't logged out when the activity exits, still need to explicitly close the realm 100 realm.close() 101 } 102 private fun refreshPieChart(context: Context, pieChart: PieChart, realm: Realm){ 103 104 this@MainActivity.realm = realm 105 var rpm_ori = realm.where<Cloud>().equalTo("sensorname","RPM").findAllAsync() 106 var rpm = rpm_ori[0]?.rpm 107 var speed_ori = realm.where<Cloud>().equalTo("sensorname","SPEED").findAllAsync() 108 var speed = speed_ori[0]?.speed 109 110 //val dimensions = listOf("A","B","C","D")//分割円の名称(String型) 111 //val values = listOf(15f,0f,0f,0f)//分割円の大きさ(Float型) 112 var (dimensionsSPEED, valuesSPEED) = makePieDashboardData(speed?.toFloat()!!,0f,9f) 113 var (dimensionsRPM, valuesRPM) = makePieDashboardData(rpm?.toFloat()!!,0f,300f) 114 //Chartフォーマット 115 //var pieChartFormat = PieChartFormat() 116 val speedChartFormat = PieChartFormat( 117 legendFormat = null,//凡例形状, 118 legentTextColor = Color.WHITE,//凡例文字色 119 description = null,//グラフ説明 120 bgColor = null,//背景 121 touch = true,//タッチ操作の有・不可 122 centerText = "速度[m/s]",//中央に表示するテキスト 123 centerTextSize = 15f,//上のテキストサイズ 124 centerTextColor = Color.WHITE,//上のテキストカラー 125 holeRadius = 65f,//中央の半径 126 holeColor = Color.TRANSPARENT//中央の塗りつぶし色 127 ) 128 129 val rpmChartFormat = PieChartFormat( 130 legendFormat = null, 131 legentTextColor = Color.WHITE, 132 description = null, 133 bgColor = null, 134 touch = true, 135 centerText = "回転数[rpm]", 136 centerTextSize = 15f, 137 centerTextColor = Color.WHITE, 138 holeRadius = 65f, 139 holeColor = Color.TRANSPARENT,//透明 140 ) 141 //DataSetフォーマット 142 //var pieDataSetFormat = PieDataSetFormat() 143 val speedDSFormat = PieDataSetFormat( 144 drawValue = true, 145 valueTextColor = null, 146 valueTextSize = null, 147 valueTextFormatter = null, 148 axisDependency = null, 149 colors = listOf(Color.rgb(243,201,14),Color.GRAY)//円の色 150 ) 151 val rpmDSFormat = PieDataSetFormat( 152 drawValue = true, 153 valueTextColor = null, 154 valueTextSize = null, 155 valueTextFormatter = null, 156 axisDependency = null, 157 colors = listOf(Color.RED, Color.GRAY) 158 ) 159 //1.Entryにデータ格納 160 //val pieEntries = makePieChartEntries(dimensions,values) 161 val speedEntries = makePieChartEntries(dimensionsSPEED,valuesSPEED) 162 val rpmEntries = makePieChartEntries(dimensionsRPM,valuesRPM) 163 164 //2~7グラフ作成 165 //左から二番目にpiechart.を入れる場合は注意!!同じものとみなしてスタックします 166 //setupPieChart(pieEntries,pieChart,"pieChart",pieChartFormat,pieDataSetFormat) 167 setupPieChart(speedEntries,findViewById(R.id.speed),"速度",speedChartFormat,speedDSFormat) 168 setupPieChart(rpmEntries,findViewById(R.id.rpm),"回転数",rpmChartFormat,rpmDSFormat) 169 } 170 171 private fun refreshSingleLineChart(context: Context,lineChart: LineChart){ 172 val x = listOf<Float>(1f, 2f, 3f, 5f, 8f, 13f, 21f, 34f)//X軸データ 173 val y = x.map{it*it}//y軸データ 174 //chartフォーマット 175 val lineChartFormat = LineChartFormat() 176 //DataSetフォーマット(カテゴリ名のmap) 177 val lineDataSetFormat = mapOf( 178 "linear" to LineDataSetFormat(drawValue = false) 179 ) 180 //1.Entryにデータ格納 181 val allLinesEntries: MutableMap<String, MutableList<Entry>> = mutableMapOf( 182 "linear" to makeLineChartData(x,y) 183 ) 184 185 setupLineChart(allLinesEntries, lineChart, lineChartFormat, lineDataSetFormat, context) 186 } 187 188 override fun onStop() { 189 super.onStop() 190 user.run { 191 realm.close() 192 } 193 } 194 195 override fun onCreateOptionsMenu(menu: Menu): Boolean { 196 menuInflater.inflate(R.menu.logout_menu, menu) 197 return true 198 } 199 200 //logoutメニューを押したときの処理(ログアウト) 201 override fun onOptionsItemSelected(item: MenuItem): Boolean { 202 return when (item.itemId) { 203 R.id.action_logout -> { 204 user?.logOutAsync { 205 if (it.isSuccess) { 206 // always close the realm when finished interacting to free up resources 207 realm.close() 208 user = null 209 Log.v(TAG(), "user logged out") 210 startActivity(Intent(this, LoginActivity::class.java)) 211 } else { 212 Log.e(TAG(), "log out failed! Error: ${it.error}") 213 } 214 } 215 true 216 } 217 else -> { 218 super.onOptionsItemSelected(item) 219 } 220 } 221 } 222 223 224 private fun setupRecyclerView(realm: Realm) { 225 226 } 227 228}
参考元:https://qiita.com/c60evaporator/items/8cd83abfeb3b232413d1
個人的に調べましたが、更新前のデータが残ってしまっているのでrealm.close
で前のデータを消し?て、Realm.getDefaultInstance()
で更新が必要であると考えています。
これ以上どんな試行錯誤してもできなかったのでどこが悪くどこを変更すれば良いかや、考え方などを教えていただけますと幸いです。まだまだ勉強不足なところがあり、基礎的なところで躓いてるかもしれません...
以上、よろしくお願いします!
あなたの回答
tips
プレビュー