11abddd9f6225298066094e20a6c29061b6af4590Nick Chalko/* 21abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Copyright (C) 2015 The Android Open Source Project 31abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * 41abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License"); 51abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * you may not use this file except in compliance with the License. 61abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * You may obtain a copy of the License at 71abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * 81abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * http://www.apache.org/licenses/LICENSE-2.0 91abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * 101abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Unless required by applicable law or agreed to in writing, software 111abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS, 121abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * See the License for the specific language governing permissions and 141abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * limitations under the License. 151abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 161abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 171abddd9f6225298066094e20a6c29061b6af4590Nick Chalkopackage com.android.tv.dvr.provider; 181abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 19ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkoimport android.content.ContentValues; 201abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport android.content.Context; 211abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport android.database.Cursor; 221abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport android.database.sqlite.SQLiteDatabase; 231abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport android.database.sqlite.SQLiteOpenHelper; 241abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport android.database.sqlite.SQLiteQueryBuilder; 2565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.database.sqlite.SQLiteStatement; 2665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.provider.BaseColumns; 2765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.text.TextUtils; 281abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport android.util.Log; 291abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 306ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport com.android.tv.dvr.data.ScheduledRecording; 316ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport com.android.tv.dvr.data.SeriesRecording; 3265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport com.android.tv.dvr.provider.DvrContract.Schedules; 3365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport com.android.tv.dvr.provider.DvrContract.SeriesRecordings; 34ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 351abddd9f6225298066094e20a6c29061b6af4590Nick Chalko/** 361abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * A data class for one recorded contents. 371abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 381abddd9f6225298066094e20a6c29061b6af4590Nick Chalkopublic class DvrDatabaseHelper extends SQLiteOpenHelper { 391abddd9f6225298066094e20a6c29061b6af4590Nick Chalko private static final String TAG = "DvrDatabaseHelper"; 401abddd9f6225298066094e20a6c29061b6af4590Nick Chalko private static final boolean DEBUG = true; 411abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 4265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko private static final int DATABASE_VERSION = 17; 431abddd9f6225298066094e20a6c29061b6af4590Nick Chalko private static final String DB_NAME = "dvr.db"; 441abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 4565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko private static final String SQL_CREATE_SCHEDULES = 4665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko "CREATE TABLE " + Schedules.TABLE_NAME + "(" 4765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + Schedules._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," 4865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + Schedules.COLUMN_PRIORITY + " INTEGER DEFAULT " 4965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + ScheduledRecording.DEFAULT_PRIORITY + "," 5065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + Schedules.COLUMN_TYPE + " TEXT NOT NULL," 5165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + Schedules.COLUMN_INPUT_ID + " TEXT NOT NULL," 5265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + Schedules.COLUMN_CHANNEL_ID + " INTEGER NOT NULL," 5365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + Schedules.COLUMN_PROGRAM_ID + " INTEGER," 5465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + Schedules.COLUMN_PROGRAM_TITLE + " TEXT," 5565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + Schedules.COLUMN_START_TIME_UTC_MILLIS + " INTEGER NOT NULL," 5665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + Schedules.COLUMN_END_TIME_UTC_MILLIS + " INTEGER NOT NULL," 5765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + Schedules.COLUMN_SEASON_NUMBER + " TEXT," 5865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + Schedules.COLUMN_EPISODE_NUMBER + " TEXT," 5965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + Schedules.COLUMN_EPISODE_TITLE + " TEXT," 6065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + Schedules.COLUMN_PROGRAM_DESCRIPTION + " TEXT," 6165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + Schedules.COLUMN_PROGRAM_LONG_DESCRIPTION + " TEXT," 6265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + Schedules.COLUMN_PROGRAM_POST_ART_URI + " TEXT," 6365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + Schedules.COLUMN_PROGRAM_THUMBNAIL_URI + " TEXT," 6465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + Schedules.COLUMN_STATE + " TEXT NOT NULL," 6565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + Schedules.COLUMN_SERIES_RECORDING_ID + " INTEGER," 6665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + "FOREIGN KEY(" + Schedules.COLUMN_SERIES_RECORDING_ID + ") " 6765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + "REFERENCES " + SeriesRecordings.TABLE_NAME 6865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + "(" + SeriesRecordings._ID + ") " 6965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + "ON UPDATE CASCADE ON DELETE SET NULL);"; 7065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 7165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko private static final String SQL_DROP_SCHEDULES = "DROP TABLE IF EXISTS " + Schedules.TABLE_NAME; 7265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 7365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko private static final String SQL_CREATE_SERIES_RECORDINGS = 7465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko "CREATE TABLE " + SeriesRecordings.TABLE_NAME + "(" 7565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + SeriesRecordings._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," 7665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + SeriesRecordings.COLUMN_PRIORITY + " INTEGER DEFAULT " 7765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + SeriesRecording.DEFAULT_PRIORITY + "," 7865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + SeriesRecordings.COLUMN_TITLE + " TEXT NOT NULL," 7965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + SeriesRecordings.COLUMN_SHORT_DESCRIPTION + " TEXT," 8065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + SeriesRecordings.COLUMN_LONG_DESCRIPTION + " TEXT," 8165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + SeriesRecordings.COLUMN_INPUT_ID + " TEXT NOT NULL," 8265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + SeriesRecordings.COLUMN_CHANNEL_ID + " INTEGER NOT NULL," 8365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + SeriesRecordings.COLUMN_SERIES_ID + " TEXT NOT NULL," 8465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + SeriesRecordings.COLUMN_START_FROM_SEASON + " INTEGER DEFAULT " 8565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + SeriesRecordings.THE_BEGINNING + "," 8665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + SeriesRecordings.COLUMN_START_FROM_EPISODE + " INTEGER DEFAULT " 8765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + SeriesRecordings.THE_BEGINNING + "," 8865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + SeriesRecordings.COLUMN_CHANNEL_OPTION + " TEXT DEFAULT " 8965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + SeriesRecordings.OPTION_CHANNEL_ONE + "," 9065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + SeriesRecordings.COLUMN_CANONICAL_GENRE + " TEXT," 9165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + SeriesRecordings.COLUMN_POSTER_URI + " TEXT," 9265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + SeriesRecordings.COLUMN_PHOTO_URI + " TEXT," 9365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko + SeriesRecordings.COLUMN_STATE + " TEXT)"; 9465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 9565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko private static final String SQL_DROP_SERIES_RECORDINGS = "DROP TABLE IF EXISTS " + 9665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko SeriesRecordings.TABLE_NAME; 9765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 9865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko private static final int SQL_DATA_TYPE_LONG = 0; 9965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko private static final int SQL_DATA_TYPE_INT = 1; 10065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko private static final int SQL_DATA_TYPE_STRING = 2; 10165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 10265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko private static final ColumnInfo[] COLUMNS_SCHEDULES = new ColumnInfo[] { 10365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(Schedules._ID, SQL_DATA_TYPE_LONG), 10465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(Schedules.COLUMN_PRIORITY, SQL_DATA_TYPE_LONG), 10565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(Schedules.COLUMN_TYPE, SQL_DATA_TYPE_STRING), 10665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(Schedules.COLUMN_INPUT_ID, SQL_DATA_TYPE_STRING), 10765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(Schedules.COLUMN_CHANNEL_ID, SQL_DATA_TYPE_LONG), 10865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(Schedules.COLUMN_PROGRAM_ID, SQL_DATA_TYPE_LONG), 10965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(Schedules.COLUMN_PROGRAM_TITLE, SQL_DATA_TYPE_STRING), 11065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(Schedules.COLUMN_START_TIME_UTC_MILLIS, SQL_DATA_TYPE_LONG), 11165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(Schedules.COLUMN_END_TIME_UTC_MILLIS, SQL_DATA_TYPE_LONG), 11265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(Schedules.COLUMN_SEASON_NUMBER, SQL_DATA_TYPE_STRING), 11365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(Schedules.COLUMN_EPISODE_NUMBER, SQL_DATA_TYPE_STRING), 11465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(Schedules.COLUMN_EPISODE_TITLE, SQL_DATA_TYPE_STRING), 11565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(Schedules.COLUMN_PROGRAM_DESCRIPTION, SQL_DATA_TYPE_STRING), 11665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(Schedules.COLUMN_PROGRAM_LONG_DESCRIPTION, SQL_DATA_TYPE_STRING), 11765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(Schedules.COLUMN_PROGRAM_POST_ART_URI, SQL_DATA_TYPE_STRING), 11865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(Schedules.COLUMN_PROGRAM_THUMBNAIL_URI, SQL_DATA_TYPE_STRING), 11965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(Schedules.COLUMN_STATE, SQL_DATA_TYPE_STRING), 12065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(Schedules.COLUMN_SERIES_RECORDING_ID, SQL_DATA_TYPE_LONG)}; 1211abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 12265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko private static final String SQL_INSERT_SCHEDULES = 12365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko buildInsertSql(Schedules.TABLE_NAME, COLUMNS_SCHEDULES); 12465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko private static final String SQL_UPDATE_SCHEDULES = 12565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko buildUpdateSql(Schedules.TABLE_NAME, COLUMNS_SCHEDULES); 12665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko private static final String SQL_DELETE_SCHEDULES = buildDeleteSql(Schedules.TABLE_NAME); 12765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 12865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko private static final ColumnInfo[] COLUMNS_SERIES_RECORDINGS = new ColumnInfo[] { 12965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(SeriesRecordings._ID, SQL_DATA_TYPE_LONG), 13065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(SeriesRecordings.COLUMN_PRIORITY, SQL_DATA_TYPE_LONG), 13165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(SeriesRecordings.COLUMN_INPUT_ID, SQL_DATA_TYPE_STRING), 13265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(SeriesRecordings.COLUMN_CHANNEL_ID, SQL_DATA_TYPE_LONG), 13365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(SeriesRecordings.COLUMN_SERIES_ID, SQL_DATA_TYPE_STRING), 13465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(SeriesRecordings.COLUMN_TITLE, SQL_DATA_TYPE_STRING), 13565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(SeriesRecordings.COLUMN_SHORT_DESCRIPTION, SQL_DATA_TYPE_STRING), 13665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(SeriesRecordings.COLUMN_LONG_DESCRIPTION, SQL_DATA_TYPE_STRING), 13765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(SeriesRecordings.COLUMN_START_FROM_SEASON, SQL_DATA_TYPE_INT), 13865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(SeriesRecordings.COLUMN_START_FROM_EPISODE, SQL_DATA_TYPE_INT), 13965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(SeriesRecordings.COLUMN_CHANNEL_OPTION, SQL_DATA_TYPE_STRING), 14065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(SeriesRecordings.COLUMN_CANONICAL_GENRE, SQL_DATA_TYPE_STRING), 14165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(SeriesRecordings.COLUMN_POSTER_URI, SQL_DATA_TYPE_STRING), 14265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(SeriesRecordings.COLUMN_PHOTO_URI, SQL_DATA_TYPE_STRING), 14365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko new ColumnInfo(SeriesRecordings.COLUMN_STATE, SQL_DATA_TYPE_STRING)}; 14465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 14565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko private static final String SQL_INSERT_SERIES_RECORDINGS = 14665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko buildInsertSql(SeriesRecordings.TABLE_NAME, COLUMNS_SERIES_RECORDINGS); 14765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko private static final String SQL_UPDATE_SERIES_RECORDINGS = 14865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko buildUpdateSql(SeriesRecordings.TABLE_NAME, COLUMNS_SERIES_RECORDINGS); 14965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko private static final String SQL_DELETE_SERIES_RECORDINGS = 15065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko buildDeleteSql(SeriesRecordings.TABLE_NAME); 15165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 15265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko private static String buildInsertSql(String tableName, ColumnInfo[] columns) { 15365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko StringBuilder sb = new StringBuilder(); 15465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko sb.append("INSERT INTO ").append(tableName).append(" ("); 15565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko boolean appendComma = false; 15665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko for (ColumnInfo columnInfo : columns) { 15765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko if (appendComma) { 15865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko sb.append(","); 15965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 16065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko appendComma = true; 16165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko sb.append(columnInfo.name); 16265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 16365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko sb.append(") VALUES (?"); 16465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko for (int i = 1; i < columns.length; ++i) { 16565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko sb.append(",?"); 16665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 16765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko sb.append(")"); 16865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko return sb.toString(); 16965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 17065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 17165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko private static String buildUpdateSql(String tableName, ColumnInfo[] columns) { 17265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko StringBuilder sb = new StringBuilder(); 17365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko sb.append("UPDATE ").append(tableName).append(" SET "); 17465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko boolean appendComma = false; 17565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko for (ColumnInfo columnInfo : columns) { 17665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko if (appendComma) { 17765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko sb.append(","); 17865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 17965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko appendComma = true; 18065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko sb.append(columnInfo.name).append("=?"); 18165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 18265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko sb.append(" WHERE ").append(BaseColumns._ID).append("=?"); 18365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko return sb.toString(); 18465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 18565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 18665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko private static String buildDeleteSql(String tableName) { 18765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko return "DELETE FROM " + tableName + " WHERE " + BaseColumns._ID + "=?"; 18865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 1891abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public DvrDatabaseHelper(Context context) { 1901abddd9f6225298066094e20a6c29061b6af4590Nick Chalko super(context.getApplicationContext(), DB_NAME, null, DATABASE_VERSION); 1911abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 1921abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 1931abddd9f6225298066094e20a6c29061b6af4590Nick Chalko @Override 1941abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public void onConfigure(SQLiteDatabase db) { 1951abddd9f6225298066094e20a6c29061b6af4590Nick Chalko db.setForeignKeyConstraintsEnabled(true); 1961abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 1971abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 1981abddd9f6225298066094e20a6c29061b6af4590Nick Chalko @Override 1991abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public void onCreate(SQLiteDatabase db) { 20065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko if (DEBUG) Log.d(TAG, "Executing SQL: " + SQL_CREATE_SCHEDULES); 20165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko db.execSQL(SQL_CREATE_SCHEDULES); 20265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko if (DEBUG) Log.d(TAG, "Executing SQL: " + SQL_CREATE_SERIES_RECORDINGS); 20365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko db.execSQL(SQL_CREATE_SERIES_RECORDINGS); 2041abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 2051abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 2061abddd9f6225298066094e20a6c29061b6af4590Nick Chalko @Override 2071abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 20865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko if (DEBUG) Log.d(TAG, "Executing SQL: " + SQL_DROP_SCHEDULES); 20965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko db.execSQL(SQL_DROP_SCHEDULES); 21065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko if (DEBUG) Log.d(TAG, "Executing SQL: " + SQL_DROP_SERIES_RECORDINGS); 21165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko db.execSQL(SQL_DROP_SERIES_RECORDINGS); 2121abddd9f6225298066094e20a6c29061b6af4590Nick Chalko onCreate(db); 2131abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 2141abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 2151abddd9f6225298066094e20a6c29061b6af4590Nick Chalko /** 2161abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Handles the query request and returns a {@link Cursor}. 2171abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 2181abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public Cursor query(String tableName, String[] projections) { 2191abddd9f6225298066094e20a6c29061b6af4590Nick Chalko SQLiteDatabase db = getReadableDatabase(); 2201abddd9f6225298066094e20a6c29061b6af4590Nick Chalko SQLiteQueryBuilder builder = new SQLiteQueryBuilder(); 2211abddd9f6225298066094e20a6c29061b6af4590Nick Chalko builder.setTables(tableName); 2221abddd9f6225298066094e20a6c29061b6af4590Nick Chalko return builder.query(db, projections, null, null, null, null, null); 2231abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 224ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 225ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko /** 22665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Inserts schedules. 227ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko */ 22865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko public void insertSchedules(ScheduledRecording... scheduledRecordings) { 22965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko SQLiteDatabase db = getWritableDatabase(); 23065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko SQLiteStatement statement = db.compileStatement(SQL_INSERT_SCHEDULES); 23165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko db.beginTransaction(); 23265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko try { 23365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko for (ScheduledRecording r : scheduledRecordings) { 23465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko statement.clearBindings(); 23565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko ContentValues values = ScheduledRecording.toContentValues(r); 23665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko bindColumns(statement, COLUMNS_SCHEDULES, values); 23765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko statement.execute(); 23865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 23965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko db.setTransactionSuccessful(); 24065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } finally { 24165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko db.endTransaction(); 24265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 24365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 244ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 24565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko /** 24665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Update schedules. 24765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko */ 24865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko public void updateSchedules(ScheduledRecording... scheduledRecordings) { 24965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko SQLiteDatabase db = getWritableDatabase(); 25065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko SQLiteStatement statement = db.compileStatement(SQL_UPDATE_SCHEDULES); 25165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko db.beginTransaction(); 25265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko try { 25365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko for (ScheduledRecording r : scheduledRecordings) { 25465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko statement.clearBindings(); 25565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko ContentValues values = ScheduledRecording.toContentValues(r); 25665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko bindColumns(statement, COLUMNS_SCHEDULES, values); 25765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko statement.bindLong(COLUMNS_SCHEDULES.length + 1, r.getId()); 25865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko statement.execute(); 25965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 26065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko db.setTransactionSuccessful(); 26165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } finally { 26265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko db.endTransaction(); 26365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 26465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 26565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 26665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko /** 26765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Delete schedules. 26865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko */ 26965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko public void deleteSchedules(ScheduledRecording... scheduledRecordings) { 27065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko SQLiteDatabase db = getWritableDatabase(); 27165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko SQLiteStatement statement = db.compileStatement(SQL_DELETE_SCHEDULES); 27265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko db.beginTransaction(); 27365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko try { 27465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko for (ScheduledRecording r : scheduledRecordings) { 27565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko statement.clearBindings(); 27665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko statement.bindLong(1, r.getId()); 27765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko statement.execute(); 27865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 27965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko db.setTransactionSuccessful(); 28065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } finally { 28165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko db.endTransaction(); 282ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 283ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 284ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 285ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko /** 28665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Inserts series recordings. 287ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko */ 28865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko public void insertSeriesRecordings(SeriesRecording... seriesRecordings) { 289ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko SQLiteDatabase db = getWritableDatabase(); 29065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko SQLiteStatement statement = db.compileStatement(SQL_INSERT_SERIES_RECORDINGS); 29165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko db.beginTransaction(); 29265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko try { 29365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko for (SeriesRecording r : seriesRecordings) { 29465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko statement.clearBindings(); 29565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko ContentValues values = SeriesRecording.toContentValues(r); 29665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko bindColumns(statement, COLUMNS_SERIES_RECORDINGS, values); 29765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko statement.execute(); 29865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 29965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko db.setTransactionSuccessful(); 30065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } finally { 30165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko db.endTransaction(); 302ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 303ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 304ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 30565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko /** 30665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Update series recordings. 30765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko */ 30865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko public void updateSeriesRecordings(SeriesRecording... seriesRecordings) { 30965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko SQLiteDatabase db = getWritableDatabase(); 31065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko SQLiteStatement statement = db.compileStatement(SQL_UPDATE_SERIES_RECORDINGS); 31165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko db.beginTransaction(); 31265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko try { 31365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko for (SeriesRecording r : seriesRecordings) { 31465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko statement.clearBindings(); 31565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko ContentValues values = SeriesRecording.toContentValues(r); 31665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko bindColumns(statement, COLUMNS_SERIES_RECORDINGS, values); 31765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko statement.bindLong(COLUMNS_SERIES_RECORDINGS.length + 1, r.getId()); 31865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko statement.execute(); 31965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 32065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko db.setTransactionSuccessful(); 32165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } finally { 32265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko db.endTransaction(); 32365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 324ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 325ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 326ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko /** 32765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Delete series recordings. 328ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko */ 32965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko public void deleteSeriesRecordings(SeriesRecording... seriesRecordings) { 330ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko SQLiteDatabase db = getWritableDatabase(); 33165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko SQLiteStatement statement = db.compileStatement(SQL_DELETE_SERIES_RECORDINGS); 33265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko db.beginTransaction(); 33365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko try { 33465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko for (SeriesRecording r : seriesRecordings) { 33565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko statement.clearBindings(); 33665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko statement.bindLong(1, r.getId()); 33765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko statement.execute(); 33865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 33965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko db.setTransactionSuccessful(); 34065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } finally { 34165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko db.endTransaction(); 34265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 34365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 34465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 34565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko private void bindColumns(SQLiteStatement statement, ColumnInfo[] columns, 34665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko ContentValues values) { 34765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko for (int i = 0; i < columns.length; ++i) { 34865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko ColumnInfo columnInfo = columns[i]; 34965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko Object value = values.get(columnInfo.name); 35065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko switch (columnInfo.type) { 35165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko case SQL_DATA_TYPE_LONG: 35265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko if (value == null) { 35365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko statement.bindNull(i + 1); 35465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } else { 35565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko statement.bindLong(i + 1, (Long) value); 35665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 35765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko break; 35865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko case SQL_DATA_TYPE_INT: 35965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko if (value == null) { 36065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko statement.bindNull(i + 1); 36165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } else { 36265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko statement.bindLong(i + 1, (Integer) value); 36365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 36465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko break; 36565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko case SQL_DATA_TYPE_STRING: { 36665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko if (TextUtils.isEmpty((String) value)) { 36765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko statement.bindNull(i + 1); 36865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } else { 36965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko statement.bindString(i + 1, (String) value); 37065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 37165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko break; 37265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 37365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 37465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 37565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 37665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 37765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko private static class ColumnInfo { 37865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko final String name; 37965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko final int type; 38065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 38165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko ColumnInfo(String name, int type) { 38265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko this.name = name; 38365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko this.type = type; 384ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 385ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 3861abddd9f6225298066094e20a6c29061b6af4590Nick Chalko} 387