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

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

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

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

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

Kotlin

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

解決済

Cursorオブジェクトについて

Kuukai64
Kuukai64

総合スコア0

SQLite

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

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

Kotlin

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

1回答

0評価

0クリップ

46閲覧

投稿2020/04/14 18:37

Android Studioを用いてアプリ開発の勉強をしている学生です。

使用言語はKotolinです。

以下にコード一式(MainActivity.kt, DatabaseHelper.kt, activity_main.xml, strings.xmlの順)を添付しております。

SQLiteを用いてデータベースから特定の行・特定の列の値を表示させるコードの記述がMainActivity.ktのListItemClickListenerクラスのonItemClickメソッド内にあります。

ここではrawQueryメソッドでCursorオブジェクトを取得していますが、そのCursorオブジェクトについて質問があります。

質問1.
SQLiteのSELECTにおいて、WHERE句の条件式で_idを指定し、その一行だけをCursorオブジェクトとして表示しているはずなのにその後while文でCursor内を一行ずつループさせてデータを取得しようとしている理由が分かりません。
そもそも私のCursorに対する認識が間違っているのでしょうか。

質問2.
Cursorオブジェクトの0行目というのは、カラム名がある行(今回でいえば _id, name, note が書いてある一番上の行)を指しているのでしょうか。

Kotolin

package com.websarva.wings.android.databesesample import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.View import android.widget.* class MainActivity : AppCompatActivity() { //カクテルリストビューのインデックス番号とカクテル名の初期化 private var _cocktailId = -1 private var _cocktailName = "" //データベースヘルパーオブジェクト生成 private val _helper = DatabaseHelper(this@MainActivity) //最初に行われる処理 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) //カクテルリストビューにリスナクラスを設定 val lvCocktail = findViewById<ListView>(R.id.lvCocktail) lvCocktail.onItemClickListener = ListItemClickListener() } //保存ボタンがタップされた時の処理 fun onSaveButtonClick(view: View){ //入力された感想を取得 val etNote = findViewById<EditText>(R.id.etNote) val note = etNote.text.toString() //データベースヘルパーオブジェクトからデータベース接続オブジェクトを取得 val db = _helper.writableDatabase //メモデータを削除、インサートの順にSQLを実行する //削除用SQL文字列を作成 val sqlDelete = "DELETE FROM cocktailmemos WHERE _id = ?" //SQL文字列をもとにプリペアードステートメントを取得 var stmt = db.compileStatement(sqlDelete) //変数のバインド stmt.bindLong(1, _cocktailId.toLong()) //削除SQLの実行 stmt.executeUpdateDelete() //インサート用SQL文字列の生成 val sqlInsert = "INSERT INTO cocktailmemos(_id, name, note) VALUES (?, ?, ?)" //SQL文字列をもとにプリペアードステートメントを取得 stmt = db.compileStatement(sqlInsert) //変数のバインド stmt.bindLong(1, _cocktailId.toLong()) stmt.bindString(2, _cocktailName) stmt.bindString(3, note) //インサートSQLの実行 stmt.executeInsert() //感想欄の入力欄を消去 etNote.setText("") val tvCocktailName = findViewById<TextView>(R.id.tvCocktailName) tvCocktailName.text = getString(R.string.tv_name) val btnSave = findViewById<Button>(R.id.btnSave) btnSave.isEnabled = false } //カクテル名がタップされた時のリスナクラス private inner class ListItemClickListener: AdapterView.OnItemClickListener{ override fun onItemClick(parent: AdapterView<*>, view: View, position: Int, id: Long) { //カクテルリストビューのインデックス番号とカクテル名を取得 _cocktailId = position _cocktailName = parent.getItemAtPosition(position) as String //カクテル名表示欄にタップされたカクテル名を代入 val tvCocktailName = findViewById<TextView>(R.id.tvCocktailName) tvCocktailName.text = _cocktailName //保存ボタンをタップ可能にする処理 val btnSave = findViewById<Button>(R.id.btnSave) btnSave.isEnabled = true //カクテルリストをタップした時にすでにデータが存在した場合には、その内容を表示する //データベースヘルパーオブジェクトからデータベース接続オブジェクトを取得 val db = _helper.writableDatabase //主キーによる検索SQL文字列の用意 val sql = "SELECT * FROM cocktailmemos WHERE _id = ${_cocktailId}" //SQLの実行 val cursor = db.rawQuery(sql, null) //データベースから取得した値を格納するための変数の用意 var note = "" //SQL実行の戻り値であるカーソルオブジェクトをループさせてデータベース内のデータを取得 while(cursor.moveToNext()){ //カラムのインデックス値を取得 val idxNote = cursor.getColumnIndex("note") //カラムのインデックス値をもとに実際のデータを取得 note = cursor.getString(idxNote) } //感想のEditTextの画面部品を取得しデータベースの値を反映 val etNote = findViewById<EditText>(R.id.etNote) etNote.setText(note) } } //データベースヘルパークラスの解放 override fun onDestroy() { _helper.close() super.onDestroy() } }

Kotolin

package com.websarva.wings.android.databesesample import android.content.Context import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteOpenHelper class DatabaseHelper(context: Context): SQLiteOpenHelper(context, DATABASE_NAME, null, DATEBASE_VERSION) { companion object{ private const val DATABASE_NAME = "cocktailmemo.db" private const val DATEBASE_VERSION = 1 } override fun onCreate(db: SQLiteDatabase) { //テーブル作成用SQL文字列の生成 val sb = StringBuilder() sb.append("CREATE TABLE cocktailmemos (") sb.append("_id INTEGER PRIMARY KEY,") sb.append("name TEXT,") sb.append("note TEXT") sb.append(");") val sql = sb.toString() //SQLの実行 db.execSQL(sql) } override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) { } }

xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ListView android:id="@+id/lvCocktail" android:layout_width="match_parent" android:layout_height="0dp" android:layout_marginBottom="10dp" android:layout_weight="0.6" android:entries="@array/lv_cocktaillist"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/tv_lb_name" android:textSize="20sp"/> <TextView android:id="@+id/tvCocktailName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/tv_name" android:textSize="20sp"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:text="@string/tv_lb_note" android:textSize="20sp"/> <EditText android:id="@+id/etNote" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="0.4" android:gravity="top" android:inputType="textMultiLine"/> <Button android:id="@+id/btnSave" android:layout_width="match_parent" android:layout_height="wrap_content" android:enabled="false" android:onClick="onSaveButtonClick" android:text="@string/btn_save" /> </LinearLayout>

XML

<resources> <string name="app_name">データベースサンプル</string> <string-array name="lv_cocktaillist"> <item>ホワイトレディ</item> <item>バラライカ</item> <item>XYZ</item> <item>ニューヨーク</item> <item>マンハッタン</item> <item>ミシシッピミュール</item> <item>ブルーハワイ</item> </string-array> <string name="tv_lb_name">選択されたカクテル</string> <string name="tv_name">未選択</string> <string name="tv_lb_note">感想</string> <string name="btn_save">保存</string> </resources>

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

jimbe
jimbe

2020/04/14 19:08

一応, "kotlin" です\.

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

SQLite

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

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

Kotlin

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