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); ^

回答1件
あなたの回答
tips
プレビュー