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

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

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

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

Android Studio

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

Kotlin

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

Q&A

解決済

1回答

2078閲覧

[Kotlin][room]roomから要素を指定してデータを取り出そうとした際にエラーが出る。

katagiri_34

総合スコア10

SQLite

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

Android Studio

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

Kotlin

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

0グッド

0クリップ

投稿2022/06/10 03:28

編集2022/06/10 03:31

sqliteにroomを介して学生データを出し入れする簡易的なプログラムを作成しています。
sqliteへのデータの保存までは問題なく動作していたのですが、select文で要素(Name)を指定して呼び出そうとした際に起動直前でエラーが出てしまいました。

このエラーの解決のために多くのサイトを参考にしましたが、どのサイトも一貫して「*」(全指定)の呼び出ししか行っておらず、要素を指定した呼び出しは行っていませんでした。
事実として、私の環境でもDao内のクエリを「*」による呼び出しのみにすると問題なく動作するので、そもそも要素指定自体が無謀な事なのかもしれません。

エラーの内容、及びエラーに関連性のありそうなプログラムです。
解決方法や今後すべき対策など教えて頂けると助かります。

Entity.kt

import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey import org.w3c.dom.Text @Entity(tableName = "student_save") data class Student( @PrimaryKey(autoGenerate = true) val id: Int = 0, @ColumnInfo(name = "Name") val name: String = "", @ColumnInfo(name = "Pass") val pass: String = "" )

Dao.kt

import androidx.room.* import androidx.room.Dao @Dao interface Dao { //名前取得メソッド @SuppressWarnings(RoomWarnings.CURSOR_MISMATCH) @Query("SELECT Name FROM student_save WHERE id = :id") fun getName(id : Int): Student //パスワード取得メソッド @SuppressWarnings(RoomWarnings.CURSOR_MISMATCH) @Query("SELECT Pass FROM student_save WHERE id = :id") fun getPass(id : Int): Student //全取得メソッド @SuppressWarnings(RoomWarnings.CURSOR_MISMATCH) @Query("SELECT * FROM student_save") fun getAll(): Student // 挿入メソッド @Insert fun insert(playCallEntity: Student) //更新メソッド @Update fun update(user: Student) //削除メソッド @Delete fun delete(playCallEntity: Student) }

Database.kt

import android.content.Context import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase import androidx.sqlite.db.SupportSQLiteDatabase @Database(entities = [Student::class], version = 2,exportSchema = false) abstract class UserDatabase : RoomDatabase() { abstract fun userDao(): Dao companion object { private var INSTANCE: UserDatabase? = null private val lock = Any() fun getInstance(context: Context): UserDatabase { synchronized(lock) { if (INSTANCE == null) { INSTANCE = Room.databaseBuilder(context.applicationContext, UserDatabase::class.java, "Student.db") .allowMainThreadQueries() .fallbackToDestructiveMigration() .build() } return INSTANCE!! } } } }

MainActivity.kt

class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) // データベースの取得 val database = UserDatabase.getInstance(this) // UserDaoの取得 val userDao = database.userDao() ・・・       val fastuser = Student(1,"テストさん","test")   userDao.insert(fastuser) ・・・ //検索ボタンが押された場合       binding.searchButton.setOnClickListener{ binding.searchText.setText(userDao.getName(binding.plain3.text.toString().toInt())) }

表示されたエラー

エラー: The columns returned by the query does not have the fields [id,pass] in com.example.android_application.Student even though they are annotated as non-null or primitive. Columns returned by the query: [Name] public abstract com.example.android_application.Student getName(int id); ^

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

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

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

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

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

hoshi-takanori

2022/06/11 08:54

いまいち何をしたいのか分かりません。getName や getPass で名前やパスワードだけを返したいなら戻り値の型は String にすべきでは。
katagiri_34

2022/06/13 01:21

処理の流れは下記のようになっています。 処理の記述にはView Bindingを使用しています。 ・「Student」テーブルの「1」番目にデータを保存(仮データ) ・「getName」メソッドを使用して「plain3」(textPlain)に入力された「id」(int値)に対応した名前を「Student」テーブルから取得 ・取得したデータを「searchText」(TextView)に表示させる エラーはアプリを起動した直後に発生します。 期待される挙動は「searchText」に「”テストさん”」と表示されることです。 「getName」「getPass」は、今後はID検索のために利用します。
guest

回答1

0

自己解決

AndroidStudioの再起動を行ったら上記のエラーは治りました。
Daoは記述ミスなので後に修正しておきます。お騒がせして申し訳ありませんでした。

投稿2022/06/14 01:08

katagiri_34

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問