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

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

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

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

Java

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

Android

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

Q&A

解決済

1回答

421閲覧

SQLiteに接続できない

ta.ta.ta.

総合スコア1

SQLite

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

Java

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

Android

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

0グッド

0クリップ

投稿2024/11/29 03:29

編集2024/11/29 04:24

実現したいこと

androidstudioのjavaでSQLiteに接続したい

発生している問題・分からないこと

androidstudioのjavaでSQliteに接続しようとしてるのですが、データベースがcloseのままでデータを入れることができません。keep database connections openというところ押したら接続できてデータが入ってることは確認できたのですが調べたところこれは根本解決になってないとのことだったので、誰がこの現象がわかる人教えてくれるとありがたいです。エラーは何も出でおらず接続時にエラー文を出すようにしてるのですが何も出ずエラーが一個もないことで困っています。

package com.example.attendance_management; import android.content.Intent; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteStatement; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; public class MainActivity extends AppCompatActivity { private com.example.attendance_management.DatabaseHelper databaseHelper; // データベースヘルパーのインスタンス private TextView timeLabel; private Handler handler = new Handler(); private SimpleDateFormat displayFormat; // 表示用フォーマット private com.example.attendance_management.DatabaseHelper _helper; // DatabaseHelperインスタンス @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); _helper = new DatabaseHelper(MainActivity.this); // DatabaseHelper インスタンスを初期化 databaseHelper = new com.example.attendance_management.DatabaseHelper(this); // TextViewのIDを取得 timeLabel = findViewById(R.id.timelabel); // フォーマットの設定 displayFormat = new SimpleDateFormat("HH:mm:ss", Locale.getDefault()); // menu1ボタンのIDを取得 Button menucalendar = findViewById(R.id.menu1); Button menutotalsalary = findViewById(R.id.menu2); Button menubasicin = findViewById(R.id.menu3); Button checkinbutton = findViewById(R.id.checkin); Button checkoutbutton = findViewById(R.id.checkout); // ボタンが押されたときの処理 checkinbutton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 現在時刻を取得 Date now = new Date(); // 日付の部分を取得 (yyyy-MM-dd) SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); String checkinDate_data = dateFormat.format(now); // 時刻の部分を取得 (HH:mm:ss) SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss", Locale.getDefault()); String checkinTime_data = timeFormat.format(now); // データベースに保存 saveCheckTime(checkinDate_data, checkinTime_data, "", ""); } }); // ボタンが押されたときの処理 checkoutbutton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 現在時刻を取得 Date now = new Date(); // 日付の部分を取得 (yyyy-MM-dd) SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); String checkoutDate_data = dateFormat.format(now); // 時刻の部分を取得 (HH:mm:ss) SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss", Locale.getDefault()); String checkoutTime_data = timeFormat.format(now); // データベースに保存 saveCheckTime("", "", checkoutDate_data, checkoutTime_data); } }); // menu1ボタンにクリックリスナーを設定 menucalendar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this, calendar.class); startActivity(intent); } }); menutotalsalary.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this, totalsalary.class); startActivity(intent); } }); menubasicin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this, basic_information.class); startActivity(intent); } }); // Runnableを使って1秒ごとに時刻を更新 handler.post(updateTimeTask); } private Runnable updateTimeTask = new Runnable() { @Override public void run() { // 現在の日時を取得 Date now = new Date(); // 表示用の時刻をフォーマット String currentTime = displayFormat.format(now); timeLabel.setText(currentTime); // 1秒後に再実行 handler.postDelayed(this, 1000); } }; @Override protected void onDestroy() { _helper.close(); super.onDestroy(); } private void saveCheckTime(String checkinDate_data, String checkinTime_data, String checkoutDate_data, String checkoutTime_data) { SQLiteDatabase db = null; // db を try の外で宣言 SQLiteStatement stmtInsert = null; // stmtInsert を try の外で宣言 try { // 書き込み可能なデータベースを取得 db = _helper.getWritableDatabase(); // 新しいデータを挿入するSQL文 String sqlInsert = "INSERT INTO worktimetable (checkindate, checkin, checkoutdate, checkout) VALUES (?, ?, ?, ?)"; stmtInsert = db.compileStatement(sqlInsert); // 挿入用のSQL文を準備 // データをバインド if (checkinDate_data.isEmpty()) { stmtInsert.bindNull(1); // checkindate に null を挿入 stmtInsert.bindNull(2); // checkin 時間に null を挿入 } else { stmtInsert.bindString(1, checkinDate_data); stmtInsert.bindString(2, checkinTime_data); } if (checkoutDate_data.isEmpty()) { stmtInsert.bindNull(3); // checkoutdate に null を挿入 stmtInsert.bindNull(4); // checkout 時間に null を挿入 } else { stmtInsert.bindString(3, checkoutDate_data); stmtInsert.bindString(4, checkoutTime_data); } stmtInsert.executeInsert(); // 挿入実行 } catch (Exception e) { Log.e("DatabaseError", "Error occurred while accessing the database", e); } finally { // クローズ処理を必ず行う if (stmtInsert != null) { stmtInsert.close(); // stmtInsert のクローズ } if (db != null) { db.close(); // db のクローズ } } } }
package com.example.attendance_management; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "Attendance_management.db"; private static final int DATABASE_VERSION = 2; public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { StringBuilder sb = new StringBuilder(); sb.append("CREATE TABLE worktimetable ("); sb.append("_id INTEGER PRIMARY KEY,"); sb.append("checkindate TEXT,"); sb.append("checkin TEXT,"); sb.append("checkoutdate TEXT,"); // checkoutdateカラムを追加 sb.append("checkout TEXT"); // checkoutカラムを追加 sb.append(");"); String sql = sb.toString(); db.execSQL(sql); // テーブル作成SQLを実行 } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){ } }

エラーメッセージ

error

1エラーメッセージがないです。前まではちゃんとカラムを作成していて名前も一緒なのにカラムが存在しないというエラーメッセージがでていて private static final int DATABASE_VERSION = 2;このバージョンを2にしたことで解決しました。これ以外にエラーメッセージがなくとても苦戦しています。

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果
private static final int DATABASE_VERSION = 2;

2にすることでカラムのエラーが治った

補足

特になし

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

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

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

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

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

jimbe

2024/11/29 09:59

まず、androidstudio の java というのは、『androidstudio を使って java で開発中の android アプリ』ということであっているでしょうか。 それとも androidstudio のプラグイン等を作られているのでしょうか。
jimbe

2024/11/29 14:16 編集

> private com.example.attendance_management.DatabaseHelper databaseHelper; // データベースヘルパーのインスタンス > private com.example.attendance_management.DatabaseHelper _helper; // DatabaseHelperインスタンス なぜ二つもあるのでしょうか。 それと、 >db = _helper.getWritableDatabase(); で得た db は close しないように言われていたはずです。
dodox86

2024/11/30 03:31 編集

質問中の説明が「androidstudioのjavaで」とあり、どうも良く分からないなと思いましたが、Android Studioの「Database Inspector」で実行中のアプリのデータベースを見ると「closed」になっていて開けず、「Keep database connections open」とは、Database Inspectorのアイコンのボタンのことを言っているのでしょうかね。 https://developer.android.com/studio/inspect/database 質問者さんのアプリのコードをもとにAPI 26("Oreo"; Android 8.0)で作成して、 - Android Studio Ladybug | 2024.2.1 Patch 2 - Pixel 2 (API 30)のエミュレーター で試し、確認してみましたが、確かになんかちょっと挙動がおかしいかんじがします。 上記、公式のヘルプの説明ではアプリ実行中でも開けそうなかんじですが、そうもいきませんでした。 アプリをいったん終了させて[DETACHED]の状態にしたら開け、INSERTしたデータがテーブルの中にあるのを確認できました。 [本コメントの記載内容を修正、追記済み]
dodox86

2024/11/30 02:52

Database Inspector自体の不具合か、または質問者さんのアプリのコード、あるいは開発、実行環境に起因するか詳細は追ってません。参考程度のコメントです。
jimbe

2024/12/01 13:34 編集

AndroidStudio の DatabaseInspector で表示されないのは、アプリが SqliteOpenHelper から得た SQLiteDatabase を close しているためと思われます。 アプリがヘルパーから SQLiteDatabase を得ることで DatabaseInspector はそれを使って自身の表示等をしてるようで、 close しなければ(アプリを実行したまま)インスペクタでテーブル内等を見られます。
ta.ta.ta.

2024/12/02 02:37

皆さんたくさんのご意見ほんとにありがとうございます。データベースのcloseを消すことで機能しました!ほんとに感謝です。
jimbe

2024/12/03 03:08

解決しましたら、回答からベストアンサーを選ぶことで本件を解決済みとすることが出来ます。 本件はまだ回答がありませんので、ご自身で回答としてどう修正したのかをお書きになって、それをベストアンサーとして下さい。
guest

回答1

0

自己解決

データベースを閉じる文を消したことで機能しました。

投稿2024/12/04 00:49

ta.ta.ta.

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.34%

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

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

質問する

関連した質問