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