🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
SQLite

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

Kotlin

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

Q&A

解決済

1回答

1295閲覧

Kotlinを使用してSQLiteにレコードを登録する画面を作りたいですができません。

makoto-n

総合スコア436

SQLite

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

Kotlin

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

0グッド

0クリップ

投稿2019/11/02 18:11

編集2019/11/03 16:17

前提・実現したいこと

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にキャストできないようですが、書き方に悩んでます。

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

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

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

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

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

keicha_hrs

2019/11/03 13:55

> アプリの画面立ち上げもできなくなりました とありますが、現状示されているMainActivityのコードは単に各ボタンを押下したときのリスナーをセットしているのみなので、これで落ちるということは考えにくいです。Registration__Activityのコードに何かしら誤りがあったとしても、開きもしないうちにそのActivityが抱えるエラーによってアプリが落ちるということは考えられないです。LogCatではどのソースコードの何行目でエラーが発生しているのか確認できませんか?また、MainActivityの冒頭にブレークポイントを設定して1行ずつステップ実行し、どの行でアプリが落ちているのかを調べる必要があるのではないかと思います。
makoto-n

2019/11/03 15:50

ありがとうございます。 Manifest.xmlに未定義のクラスを定義していたみたいです。 アプリを立ち上げることはできました。 が、Registration__Activityの画面を表示しようとすると落ちるようになりました。
guest

回答1

0

自己解決

アンドロイドから数値の標準を取得する方法がわからなかったので、
itmPrcにもStringを取得し(DBもString)、
レコード登録時にtoIntOrNullのチェックをするように方式を変更しようと思います。
参考記事

また、
val rowId = db.insert(DBContract.ItmEntry.TABLE_NAME, null, values)
ですがrowIdを返してもエラーとなったため
db.insert(DBContract.ItmEntry.TABLE_NAME, null, values)
と変更したところアプリ立ち上げ、画面移動可能となりました。

1559-2990/? E/WifiScanner: listener cannot be found 17897-17897/? E/bluelightfilte: Not starting debugger since process cannot load the jdwp agent. 5514-17929/? E/-GA-: HelperService-FILTER_DEAD_ACTION-screen on 5514-17935/? E/-GA-: HelperService-定时-screenon-start 17897-17897/? E/reminder: receive reminder 17897-17897/? E/reminder: reminder type:0

のWarnが表示されていることが気になります。

投稿2019/11/03 18:10

makoto-n

総合スコア436

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問