1 package net.osdn.gokigen.joggingtimer.storage;
3 import android.content.ContentValues;
4 import android.content.Context;
5 import android.database.Cursor;
6 import android.database.sqlite.SQLiteDatabase;
7 import android.util.Log;
9 import net.osdn.gokigen.joggingtimer.storage.contract.TimeEntryData;
10 import net.osdn.gokigen.joggingtimer.storage.contract.TimeEntryIndex;
12 import static android.provider.BaseColumns._ID;
14 import androidx.annotation.NonNull;
21 class TimeEntryDatabase implements ITimeEntryDatabase
23 private final String TAG = toString();
24 private final TimeEntryDataOpenHelper dbHelper;
25 private final ITimeEntryDatabaseCallback callback;
26 private static final int REFERENCE_ICON_ID = 2;
27 private static final int MODEL_DATA_ICON_ID = 4;
28 private static final int DEFAULT_ICON_ID = 0;
30 private SQLiteDatabase db = null;
31 //private SQLiteDatabase writeDb = null;
32 //private SQLiteDatabase readDb = null;
34 TimeEntryDatabase(Context context, @NonNull ITimeEntryDatabaseCallback callback)
36 dbHelper = new TimeEntryDataOpenHelper(context);
37 this.callback = callback;
43 Log.v(TAG, "prepareToWrite() ");
47 // Gets the data repository in write mode
48 db = dbHelper.getWritableDatabase();
57 callback.prepareFinished(ret);
63 Log.v(TAG, "close()");
76 public Cursor getAllIndexData()
78 return (db.rawQuery("SELECT * FROM " + TimeEntryIndex.EntryIndex.TABLE_NAME + " ORDER BY " + TimeEntryIndex.EntryIndex.COLUMN_NAME_START_TIME + " DESC", null));
82 public Cursor getAllDetailData(long indexId)
84 return (db.rawQuery("SELECT * FROM " + TimeEntryData.EntryData.TABLE_NAME + " WHERE " + TimeEntryData.EntryData.COLUMN_NAME_INDEX_ID + " = " + indexId + " ORDER BY " + TimeEntryData.EntryData.COLUMN_NAME_TIME_ENTRY, null));
88 public Cursor getAllReferenceDetailData()
94 String queryString = "SELECT * FROM " + TimeEntryIndex.EntryIndex.TABLE_NAME + " INNER JOIN " + TimeEntryData.EntryData.TABLE_NAME +
95 " ON " + TimeEntryIndex.EntryIndex.TABLE_NAME + "." + TimeEntryIndex.EntryIndex._ID + " = " + TimeEntryData.EntryData.TABLE_NAME+ "." + TimeEntryData.EntryData.COLUMN_NAME_INDEX_ID +
96 " WHERE " + TimeEntryIndex.EntryIndex.TABLE_NAME+ "." + TimeEntryIndex.EntryIndex.COLUMN_NAME_ICON_ID + " = " + REFERENCE_ICON_ID +
97 " ORDER BY " + TimeEntryData.EntryData.TABLE_NAME+ "." + TimeEntryData.EntryData.COLUMN_NAME_TIME_ENTRY;
98 //Log.v(TAG, "Query : " + queryString);
99 return (db.rawQuery(queryString, null));
103 public Cursor getIndexdata(long indexId)
105 return (db.rawQuery("SELECT * FROM " + TimeEntryIndex.EntryIndex.TABLE_NAME + " WHERE " + TimeEntryIndex.EntryIndex._ID + " = " + indexId + " ORDER BY " + TimeEntryIndex.EntryIndex.COLUMN_NAME_START_TIME, null));
109 public void deleteTimeEntryData(long indexId)
111 int delRecord = db.delete(TimeEntryData.EntryData.TABLE_NAME, TimeEntryData.EntryData.COLUMN_NAME_INDEX_ID + " = " + indexId, null);
112 int delIndex = db.delete(TimeEntryIndex.EntryIndex.TABLE_NAME, _ID + " = " + indexId, null);
114 Log.v(TAG, "deleteTimeEntryData() index : " + indexId + "Recs. [" + delIndex + "] (" + delRecord + ")");
122 public void updateIndexData(long indexId, String title, int icon)
126 if ((title != null)&&(!title.isEmpty()))
128 ContentValues titleValues = new ContentValues();
129 titleValues.put(TimeEntryIndex.EntryIndex.COLUMN_NAME_TITLE, title);
130 db.update(TimeEntryIndex.EntryIndex.TABLE_NAME, titleValues, _ID + " = " + indexId, null);
133 ContentValues iconValues = new ContentValues();
134 iconValues.put(TimeEntryIndex.EntryIndex.COLUMN_NAME_ICON_ID, icon);
135 db.update(TimeEntryIndex.EntryIndex.TABLE_NAME, iconValues, _ID + " = " + indexId, null);
148 public void setReferenceIndexData(long indexId)
152 ContentValues clearValues = new ContentValues();
153 clearValues.put(TimeEntryIndex.EntryIndex.COLUMN_NAME_ICON_ID, DEFAULT_ICON_ID);
154 db.update(TimeEntryIndex.EntryIndex.TABLE_NAME, clearValues, TimeEntryIndex.EntryIndex.COLUMN_NAME_ICON_ID + " = " + REFERENCE_ICON_ID, null);
156 ContentValues referenceValues = new ContentValues();
157 referenceValues.put(TimeEntryIndex.EntryIndex.COLUMN_NAME_ICON_ID, REFERENCE_ICON_ID);
158 db.update(TimeEntryIndex.EntryIndex.TABLE_NAME, referenceValues, _ID + " = " + indexId, null);
167 public void createIndexData(String title, String memo, int icon, long startTime)
169 long indexId = createIndexDataImpl(true, title, memo, icon, startTime, 0);
170 Log.v(TAG, "createIndexData() [" + title +"] " + memo + " " + icon + " " + startTime + " idx: " + indexId);
173 private long createIndexDataImpl(boolean isCallback, String title, String memo, int icon, long startTime, long duration)
179 ContentValues valuesIndex = new ContentValues();
180 valuesIndex.put(TimeEntryIndex.EntryIndex.COLUMN_NAME_TITLE, title);
181 valuesIndex.put(TimeEntryIndex.EntryIndex.COLUMN_NAME_MEMO, memo);
182 valuesIndex.put(TimeEntryIndex.EntryIndex.COLUMN_NAME_ICON_ID, icon);
183 valuesIndex.put(TimeEntryIndex.EntryIndex.COLUMN_NAME_START_TIME, startTime);
184 valuesIndex.put(TimeEntryIndex.EntryIndex.COLUMN_NAME_TIME_DURATION, duration);
185 indexId = db.insert(TimeEntryIndex.EntryIndex.TABLE_NAME, null, valuesIndex);
192 callback.dataEntryFinished(ITimeEntryDatabaseCallback.OperationType.CREATED, ret, indexId, title);
199 appendTimeDataImpl(true, indexId, startTime, DEFAULT_RECORD_TYPE);
204 public void appendTimeData(long indexId, long lapTime)
206 Log.v(TAG, "appendTimeData() " + lapTime);
207 appendTimeDataImpl(true, indexId, lapTime, DEFAULT_RECORD_TYPE);
214 private void appendTimeDataImpl(boolean isCallback, long indexId, long lapTime, long recordType)
219 ContentValues valuesData = new ContentValues();
220 valuesData.put(TimeEntryData.EntryData.COLUMN_NAME_INDEX_ID, indexId);
221 valuesData.put(TimeEntryData.EntryData.COLUMN_NAME_TIME_ENTRY, lapTime);
222 valuesData.put(TimeEntryData.EntryData.COLUMN_NAME_OTHER_ID, 0);
223 valuesData.put(TimeEntryData.EntryData.COLUMN_NAME_GPS_ID, 0);
224 valuesData.put(TimeEntryData.EntryData.COLUMN_NAME_MEMO_ID, 0);
225 valuesData.put(TimeEntryData.EntryData.COLUMN_NAME_ICON_ID, 0);
226 valuesData.put(TimeEntryData.EntryData.COLUMN_NAME_RECORD_TYPE, recordType);
227 long dataId = db.insert(TimeEntryData.EntryData.TABLE_NAME, null, valuesData);
234 callback.timeEntryFinished(ITimeEntryDatabaseCallback.OperationType.APPENDED, ret, indexId, dataId);
249 public void finishTimeData(long indexId, long startTime, long endTime)
251 Log.v(TAG, "finishTimeData() " + endTime);
255 appendTimeData(indexId, endTime);
256 long elapsedTime = endTime - startTime;
261 ContentValues valuesIndex = new ContentValues();
262 valuesIndex.put(TimeEntryIndex.EntryIndex.COLUMN_NAME_TIME_DURATION, elapsedTime);
263 int rows = db.update(TimeEntryIndex.EntryIndex.TABLE_NAME, valuesIndex, "_id=" + indexId, null);
268 callback.dataEntryFinished(ITimeEntryDatabaseCallback.OperationType.FINISHED, ret, indexId, "");
281 public long createTimeEntryModelData(int lap, long totalTime, @NonNull String memo)
283 long diffTime = totalTime / (long) lap;
284 String title = " " + lap + " LAPs Model";
285 Log.v(TAG, "ENTRY : '" + lap + " " + title + "' mills : " + "(" + diffTime + ") " + memo);
290 long indexId = createIndexDataImpl(false, title, memo, MODEL_DATA_ICON_ID, lapTime, totalTime);
291 for (int index = 0; index < lap; index++)
293 lapTime = lapTime + diffTime;
294 appendTimeDataImpl(false, indexId, lapTime, EDITABLE_RECORD_TYPE);
296 callback.modelDataEntryFinished(ITimeEntryDatabaseCallback.OperationType.FINISHED, true, indexId, title);
303 callback.modelDataEntryFinished(ITimeEntryDatabaseCallback.OperationType.FINISHED, false, -1, title);
312 public int updateTimeEntryData(long detailId, long totalTime)
315 Log.v(TAG, "updateTimeEntryData (" + detailId + ") : " + totalTime);
318 ContentValues timeValue = new ContentValues();
319 timeValue.put(TimeEntryData.EntryData.COLUMN_NAME_TIME_ENTRY, totalTime);
320 rows = db.update(TimeEntryData.EntryData.TABLE_NAME, timeValue, _ID + " = " + detailId, null);
330 public boolean prepareToRead()
332 Log.v(TAG, "prepareToRead() ");
336 // Gets the data repository in read mode
337 readDb = dbHelper.getReadableDatabase();
347 public boolean prepareToWrite()
349 Log.v(TAG, "prepareToWrite() ");
353 // Gets the data repository in write mode
354 writeDb = dbHelper.getWritableDatabase();