前提・実現したいこと
Kotlinを使用してAndroidアプリを作成中です。
SQLiteを使用してレコードの登録を行いたいのですが、SQLiteを実装しようとしたところアプリの画面立ち上げもできなくなりました。
SQLite__HelperとRegistration__Activityのミスを教えてもらいたいです。
基礎をおさえたいと考えたのでRoomとかは使っていません。
よろしくお願いします。
発生している問題・エラーメッセージ
Logcat,Verboseで
getDiskStats failed with result NOT_SUPPORTED and size 0
や
Runで
AndroidRuntime: FATAL EXCEPTION: main
java.lang.ClassNotFoundException
java.lang.RuntimeException: Unable to instantiate application
とか多くのExceptionが出ているのが気になりました。
けれど、Buildはエラーを出していませんでした。
それとrowId
が使っていなくて謎でした。
該当のソースコード
文字数の都合上importを削除しています。
MainActivity
Kotlin
1 /* 単語 2 Btn ボタン 3 edt 入力パネル 4 itm アイテム商品 5 NM Name 6 Prc 値段 7 Mdl モデル 8 list 一覧 9 registration 登録 10 read 読込み 11 cash レジ 12 aggregate 集計 13 */ 14 15 class MainActivity : AppCompatActivity() { 16 17 override fun onCreate(savedInstanceState: Bundle?) { 18 super.onCreate(savedInstanceState) 19 setContentView(R.layout.activity_main) 20 21 // 一覧表示 22 listBtn.setOnClickListener { 23 val intent = Intent(this, List__Activity::class.java) 24 startActivity(intent) 25 } 26 27 // 登録 28 registrationBtn.setOnClickListener { 29 val intent = Intent(this, Registration__Activity::class.java) 30 startActivity(intent) 31 } 32 33 // QR読込み 34 readBtn.setOnClickListener { 35 val intent = Intent(this, Read__Activity::class.java) 36 startActivity(intent) 37 } 38 39 // レジ 40 cashBtn.setOnClickListener { 41 val intent = Intent(this, Cash__Activity::class.java) 42 startActivity(intent) 43 } 44 45 // メール 46 mailBtn.setOnClickListener{ 47 val intent = Intent(this, Mail__Activity::class.java) 48 startActivity(intent) 49 } 50 51 // 集計 52 aggregateBtn.setOnClickListener { 53 val intent = Intent(this, Aggregate__Activity::class.java) 54 startActivity(intent) 55 } 56 57 } 58 }
SQLite__Helper
Kotlin
1class SQLite__Helper(context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) { 2 @Throws(SQLiteException::class) 3 fun insertItm(itmMdl: ItmMdl) : Boolean { 4 val db = writableDatabase 5 6 val values = ContentValues() 7 values.put(DBContract.ItmEntry.ITM_NM, itmMdl.itmNM) 8 values.put(DBContract.ItmEntry.ITM_PRC, itmMdl.itmPrc) 9 10/* ↓このrowIdが謎です */ 11 val rowId = db.insert(DBContract.ItmEntry.TABLE_NAME, null, values) 12 13 return true 14 } 15 16 override fun onCreate(db: SQLiteDatabase?) { 17 db?.execSQL(SQL_CREATE_ENTRIES) 18 } 19 20 override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) { 21 db?.execSQL(SQL_DELETE_ENTRIES) 22 db?.execSQL(SQL_CREATE_ENTRIES) 23 } 24 25 override fun onDowngrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) { 26 onUpgrade(db, oldVersion, newVersion) 27 } 28 29 companion object { 30 const val DATABASE_VERSION = 1 31 const val DATABASE_NAME = "ITM.db" 32 33 private const val SQL_CREATE_ENTRIES = 34 "CREATE TABLE " + DBContract.ItmEntry.TABLE_NAME + " (" + 35 DBContract.ItmEntry.ITM_NM + " TEXT ," + 36 DBContract.ItmEntry.ITM_PRC + " INTEGER )" 37 38 private const val SQL_DELETE_ENTRIES = "DROP TABLE IF EXISTS" + DBContract.ItmEntry.TABLE_NAME 39 } 40}
Registration__Activity
Kotlin
1// 登録 2class Registration__Activity : AppCompatActivity() { 3 4 override fun onCreate(savedInstanceState: Bundle?) { 5 super.onCreate(savedInstanceState) 6 setContentView(R.layout.activity_registration__) 7 val SQLite__Helper = SQLite__Helper(this) 8 9 val itmNM : String = edtNM.toString() 10 val itmPrc : Int = Integer.parseInt(edtPrc.toString()) 11 12 itmAddBtn.setOnClickListener { 13 val itmInstance = ItmMdl( 14 itmNM, itmPrc 15 ) 16 17 val result = SQLite__Helper.insertItm(itmInstance) 18 19 if (result) { 20 Toast.makeText(this, "商品登録!", LENGTH_LONG).show() 21 } 22 } 23 } 24}
ItmMdl
Kotlin
1class ItmMdl(val itmNM: String, val itmPrc: Int)
DBContract
Kotlin
1object DBContract { 2 3 class ItmEntry : BaseColumns { 4 companion object { 5 const val TABLE_NAME = "itmTbl" 6 const val ITM_NM = "itmNM" 7 const val ITM_PRC = "itmPrc" 8 } 9 } 10}
試したこと
Registration__Activityにて、参考記事では
itmAddBtn.setOnClickListener { view ->
となっていましたが、エラーが出ていたのでview ->
を削除しています
参考本も参照しましたが、Realmだったためわかりませんでした。
サイトによってHelper,Adapterの記述が違いすぎたのですが、
SQLiteをRealmやRoomを使用せずに構成することに解法のようなパターン化したものはないのでしょうか?
補足情報
参考本
「(Kotlin対応)はじめてのAndroidプログラミング 第4版」
「参考記事」
追記1
NumberFormatExceptionとなっていました。
val itmPrc: Int = edtPrc.toString().toInt()
入力値を数値型にキャストしようとしている箇所です。
コードログにあるようにStringからIntにキャストできないようですが、書き方に悩んでます。
回答1件
あなたの回答
tips
プレビュー