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

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

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

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Android Studio

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

Kotlin

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

Google マップ

Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

Q&A

解決済

1回答

738閲覧

KotlinでGoogle Mapに追加したマーカーの座標をSQLiteに保存したい。

wata-091

総合スコア2

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Android Studio

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

Kotlin

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

Google マップ

Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

0グッド

1クリップ

投稿2022/12/30 15:47

編集2023/01/03 08:46

現在、Kotlinで簡単な地図アプリを作成しております。
SupportMapFragmentにて、ActivityにGoogle Map を実装し、タップすることでマーカーを追加するところまでは実装できたのですが、そのマーカーの座標情報をDBに保存しMapを表示しているActivityを閉じても、マーカーは追加されている状態(再度Activityを開いた際にもしDBにマーカーの座標が登録されていればマーカーをMapに表示する)を実装したいと考えております。
SQLiteの仕組み等は理解しているつもりですが、タップ後にマーカーの座標をSQLiteに保存する方法と再度Activityを開いた際にMapにマーカーを表示させる方法が思い浮かばないため、何かアドバイスがあれば幸いです。
また、そもそもDBにマーカーの情報を保存する際にSQLiteを使用するのはナンセンスであるのでしょうか。
(savedInstanceStateを使ってActivityの状態を保存する方法も考えましたが、今回は上記のような方法を取りたいと考えております。)

コードについては、下記のように実装したいと考えております。
ヒントや、こうしたら実装できるかも?などなどなんでもいいので何か助言いただければ嬉しいです。

*下記編集した部分となります。
意図としましては、DBに何も保存されていない場合は、Mapに東京周辺を表示させる、保存されている場合はMap上にマーカーを表示させ、マーカー周辺のMapを表示させるという動作を実現させたいと思っています。

class Memo_dash : AppCompatActivity(), OnMapReadyCallback { private lateinit var mMap: GoogleMap private lateinit var binding: MemoDashBinding companion object{ private const val TABLE_NAME = "maps" } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) supportActionBar?.setDisplayHomeAsUpEnabled(true) binding = MemoDashBinding.inflate(layoutInflater) setContentView(binding.root) // Obtain the SupportMapFragment and get notified when the map is ready to be used. val mapFragment = supportFragmentManager .findFragmentById(R.id.map) as SupportMapFragment mapFragment.getMapAsync(this) } override fun onMapReady(googleMap: GoogleMap) { mMap = googleMap val helper = DBHelper(this) val mapsId: Long = intent.getLongExtra("id",0) if (mapsId != 0L) { helper.readableDatabase.use { db -> db.query( TABLE_NAME, arrayOf("id", "lat", "long"), "id = ?", arrayOf(mapsId.toString()), null, null, null, "1" ) .use { cursor -> if (cursor.moveToFirst()) { val location = LatLng(cursor.getDouble(1),cursor.getDouble(2)) mMap.addMarker(MarkerOptions().position(location)) mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(location,10F)) } } } }else{ val tokyo = LatLng(35.68, 139.76) mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(tokyo, 10F)) } // タップした時のリスナーをセット mMap.setOnMapClickListener { latlng1 : LatLng -> val location = LatLng(latlng1.latitude, latlng1.longitude) mMap.addMarker(MarkerOptions().position(location)) helper.writableDatabase.use { db -> val values = ContentValues().apply { put("lat", latlng1.latitude) put("long", latlng1.longitude) } if (mapsId != 0L) { db.update(TABLE_NAME, values,"id = ?", arrayOf(mapsId.toString())) } else { db.insert(TABLE_NAME,null, values) } } } } }

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

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

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

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

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

knuser

2022/12/31 01:15 編集

> タップ後にマーカーの座標をSQLiteに保存する方法と再度Activityを開いた際にMapにマーカーを表示させる方法が思い浮かばないため、何かアドバイスがあれば幸いです。 「思い浮かばない」という点をもう少し掘り下げて記載頂けると回答が集まりやすいように思うのですが、どうでしょうか? 質問内のコード例で、DBの処理や、処理を行いたいタイミングなどは既に明示されていると思いますので、どういった点が課題・不明なのかが、十分に読み取れませんでした(単純に、"lat", "long"の情報をDBに保存・読み込みする処理をSQLiteで行えれば良いのであれば、基本的なDB操作なのかとも感じたのですが)。
wata-091

2022/12/31 04:52

回答ありがとうございます。 // タップでマーカーを追加 mMap.setOnMapClickListener { latlng -> val location = LatLng(latlng.latitude, latlng.longitude) mMap.addMarker(MarkerOptions().position(location)) } 上記コードでタップした後座標が取得されると思いますが、このリスナー内から取得した値をどうやってリスナー外で使用するのか(スコープの話になると思いますが)が現在の大きな課題となっております。
guest

回答1

0

ベストアンサー

setOnMapClickListener内で、関数外のmMapを参照して操作しているわけですから、同様のことはできますよね。

  1. setOnMapClickListener内で直接DBに書き込んでしまう。特に難しくはないでしょう。 別途関数を作って書き込むようにしてもいいですが、Listener内で動くことには変りありませんね。

  2. 処理が重くなるなどの可能性や、情報を整理してから登録したいなどあるのであれば、クラス内にマーカのリストなどのオブジェクトを用意して、Listener内ではそこに登録、適切なタイミング(難しいかもしれませんが)で保存処理をする。

といった感じではないでしょうか。

投稿2022/12/31 08:00

TakaiY

総合スコア12977

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

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

wata-091

2023/01/03 06:36

TakaiYさん、回答ありがとうございます。 実際に、Listener内でDBに書き込む処理を行うコードを書いて見ました。コード自体にはエラーはみられないのですが、動作が思うようにいきません。(マーカーを追加した後、Activityを閉じて再度開いた時にマーカーがセットされている状態にしたいのですが、Activityを閉じると消えてしまう。) 再度マップを開いた時のDBからの読み込み処理も書いてみたのですが、どこかおかしなコードがないかみていただけないでしょうか。 override fun onMapReady(googleMap: GoogleMap) { mMap = googleMap val helper = DBHelper(this) val mapsId: Long = intent.getLongExtra("id",0) if (mapsId != 0L) { helper.readableDatabase.use { db -> db.query( TABLE_NAME, arrayOf("id", "lat", "long"), "id = ?", arrayOf(mapsId.toString()), null, null, null, "1" ) .use { cursor -> if (cursor.moveToFirst()) { val location = LatLng(cursor.getDouble(1),cursor.getDouble(2)) mMap.addMarker(MarkerOptions().position(location)) mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(location,10F)) } } } }else{     ↓DBに情報がなければ下記を地図上でズームする。 val tokyo = LatLng(35.68, 139.76) mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(tokyo, 10F)) } // タップした時のリスナーをセット mMap.setOnMapClickListener { latlng1 : LatLng -> val location = LatLng(latlng1.latitude, latlng1.longitude) mMap.addMarker(MarkerOptions().position(location)) helper.writableDatabase.use { db -> val values = ContentValues().apply { put("lat", latlng1.latitude) put("long", latlng1.longitude) } if (mapsId != 0L) { db.update(TABLE_NAME, values,"id = ?", arrayOf(mapsId.toString())) } else { db.insert(TABLE_NAME,null, values) } } } }
TakaiY

2023/01/03 07:55

ここに書いたものはインデントが反映されず読めないので、質問を編集して追記してください。
TakaiY

2023/01/03 08:04

中身を読んでいませんし、DBに詳しいわけでもありませんが、まずはDBに書き込めているのか確認する必要があるでしょう。 確認して、書き込めているのであれば、読むのに失敗しているわけですから原因の確認。 書き込めていないのであれば、その原因の確認をすることになりますね。
wata-091

2023/01/03 08:47

回答ありがとうございます。 質問を編集いたしました。 また、一度きちんとDBに書き込めているか等原因を探ってみたいと思います。
wata-091

2023/01/03 09:16

DBに保存されない原因がわかりました。 if (mapsId != 0L)  MainActivityからmapsIDが送られてきている場合という処理をしていたのですが、そもそもMainActivityにIDが送られていないことが原因のようです。 再度コードを見直してみます。
wata-091

2023/01/10 06:25

やりたいことができましたので、上記ベストアンサーにさせていただきます。 対応ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問