実現したいこと
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にすることでカラムのエラーが治った
補足
特になし
回答1件
あなたの回答
tips
プレビュー