/* * Copyright 2014 sonaive.com. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.sonaive.v2ex.provider; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.provider.BaseColumns; import com.sonaive.v2ex.provider.V2exContract.*; import static com.sonaive.v2ex.util.LogUtils.LOGD; import static com.sonaive.v2ex.util.LogUtils.LOGW; import static com.sonaive.v2ex.util.LogUtils.makeLogTag; /** * Created by liutao on 12/6/14. */ public class V2exDatabase extends SQLiteOpenHelper { private static final String TAG = makeLogTag(V2exDatabase.class); private static final String DATABASE_NAME = "v2ex.db"; // NOTE: carefully update onUpgrade() when bumping database versions to make // sure user data is saved. private static final int VER_2014_RELEASE_A = 1; // app version 1.0 private static final int CUR_DATABASE_VERSION = VER_2014_RELEASE_A; private final Context mContext; interface Tables { String MEMBERS = "members"; String FEEDS = "feeds"; String NODES = "nodes"; String REVIEWS = "reviews"; String SEARCH = "search"; String PICASA_IMAGES = "picasa_images"; String MODI_DATE = "modi_date"; } public V2exDatabase(Context context) { super(context, DATABASE_NAME, null, CUR_DATABASE_VERSION); mContext = context; } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE " + Tables.MEMBERS + " (" + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + MemberColumns.MEMBER_ID + " TEXT NOT NULL," + MemberColumns.MEMBER_URL + " TEXT NOT NULL," + MemberColumns.MEMBER_USERNAME + " TEXT NOT NULL," + MemberColumns.MEMBER_WEBSITE + " TEXT," + MemberColumns.MEMBER_TWITTER + " TEXT," + MemberColumns.MEMBER_PSN + " TEXT," + MemberColumns.MEMBER_GITHUB + " TEXT," + MemberColumns.MEMBER_BTC + " TEXT," + MemberColumns.MEMBER_LOCATION + " TEXT," + MemberColumns.MEMBER_TAGLINE + " TEXT," + MemberColumns.MEMBER_BIO + " TEXT," + MemberColumns.MEMBER_AVATAR_MINI + " TEXT," + MemberColumns.MEMBER_AVATAR_NORMAL + " TEXT," + MemberColumns.MEMBER_AVATAR_LARGE + " TEXT," + MemberColumns.MEMBER_CREATED + " TEXT NOT NULL," + MemberColumns.MEMBER_IMPORT_HASHCODE + " TEXT NOT NULL," + "UNIQUE (" + MemberColumns.MEMBER_ID + ") ON CONFLICT REPLACE)"); db.execSQL("CREATE TABLE " + Tables.FEEDS + " (" + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + FeedColumns.FEED_ID + " TEXT NOT NULL," + FeedColumns.FEED_TITLE + " TEXT NOT NULL," + FeedColumns.FEED_URL + " TEXT NOT NULL," + FeedColumns.FEED_CONTENT + " TEXT NOT NULL," + FeedColumns.FEED_CONTENT_RENDERED + " TEXT NOT NULL," + FeedColumns.FEED_REPLIES + " TEXT NOT NULL," + FeedColumns.FEED_MEMBER + " TEXT," + FeedColumns.FEED_NODE + " TEXT," + FeedColumns.FEED_CREATED + " TEXT NOT NULL," + FeedColumns.FEED_LAST_MODIFIED + " TEXT NOT NULL," + FeedColumns.FEED_LAST_TOUCHED + " TEXT NOT NULL," + FeedColumns.FEED_IMPORT_HASHCODE + " TEXT NOT NULL," + "UNIQUE (" + FeedColumns.FEED_ID + ") ON CONFLICT REPLACE)"); db.execSQL("CREATE TABLE " + Tables.NODES + " (" + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + NodeColumns.NODE_ID + " INTEGER," + NodeColumns.NODE_NAME + " TEXT NOT NULL," + NodeColumns.NODE_URL + " TEXT NOT NULL," + NodeColumns.NODE_TITLE + " TEXT NOT NULL," + NodeColumns.NODE_TITLE_ALTERNATIVE + " TEXT," + NodeColumns.NODE_TOPICS + " INTEGER," + NodeColumns.NODE_HEADER + " TEXT," + NodeColumns.NODE_FOOTER + " TEXT," + NodeColumns.NODE_CREATED + " TEXT NOT NULL," + NodeColumns.NODE_AVATAR_MINI + " TEXT," + NodeColumns.NODE_AVATAR_NORMAL + " TEXT," + NodeColumns.NODE_AVATAR_LARGE + " TEXT," + NodeColumns.NODE_IMPORT_HASHCODE + " TEXT NOT NULL," + "UNIQUE (" + NodeColumns.NODE_ID + ") ON CONFLICT REPLACE)"); db.execSQL("CREATE TABLE " + Tables.REVIEWS + " (" + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + ReviewColumns.REVIEW_ID + " TEXT NOT NULL," + ReviewColumns.REVIEW_TOPIC_ID + " TEXT NOT NULL," + ReviewColumns.REVIEW_THANKS + " TEXT," + ReviewColumns.REVIEW_CONTENT + " TEXT NOT NULL," + ReviewColumns.REVIEW_CONTENT_RENDERED + " TEXT," + ReviewColumns.REVIEW_MEMBER + " TEXT NOT NULL," + ReviewColumns.REVIEW_CREATED + " TEXT," + ReviewColumns.REVIEW_LAST_MODIFIED + " TEXT," + ReviewColumns.REVIEW_IMPORT_HASHCODE + " TEXT NOT NULL," + "UNIQUE (" + ReviewColumns.REVIEW_ID + ") ON CONFLICT REPLACE)"); db.execSQL("CREATE TABLE " + Tables.SEARCH + " (" + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + SearchColumns.SEARCH_KEYWORD + " TEXT," + SearchColumns.SEARCH_UPDATE_TIME + " INTEGER," + "UNIQUE (" + SearchColumns.SEARCH_KEYWORD + ") ON CONFLICT REPLACE)"); // Defines an SQLite statement that builds the Picasa picture URL table db.execSQL("CREATE TABLE " + Tables.PICASA_IMAGES + " (" + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + PicasaImageColumns.PICASA_THUMB_URL + " TEXT," + PicasaImageColumns.PICASA_IMAGE_URL + " TEXT," + PicasaImageColumns.PICASA_THUMB_URL_NAME + " TEXT," + PicasaImageColumns.PICASA_IMAGE_NAME + " TEXT)"); // Defines an SQLite statement that builds the URL modification date table db.execSQL("CREATE TABLE " + Tables.MODI_DATE + " (" + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + ModiDateColumns.MODI_DATE + " INTEGER)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { LOGD(TAG, "onUpgrade() from " + oldVersion + " to " + newVersion); // Current DB version. We update this variable as we perform upgrades to reflect // the current version we are in. int version = oldVersion; // Indicates whether the data we currently have should be invalidated as a // result of the db upgrade. Default is true (invalidate); if we detect that this // is a trivial DB upgrade, we set this to false. boolean dataInvalidated = true; LOGD(TAG, "After upgrade logic, at version " + version); // at this point, we ran out of upgrade logic, so if we are still at the wrong // version, we have no choice but to delete everything and create everything again. if (version != CUR_DATABASE_VERSION) { LOGW(TAG, "Upgrade unsuccessful -- destroying old data during upgrade"); db.execSQL("DROP TABLE IF EXISTS " + Tables.MEMBERS); db.execSQL("DROP TABLE IF EXISTS " + Tables.FEEDS); db.execSQL("DROP TABLE IF EXISTS " + Tables.NODES); db.execSQL("DROP TABLE IF EXISTS " + Tables.REVIEWS); db.execSQL("DROP TABLE IF EXISTS " + Tables.SEARCH); db.execSQL("DROP TABLE IF EXISTS " + Tables.PICASA_IMAGES); db.execSQL("DROP TABLE IF EXISTS " + Tables.MODI_DATE); onCreate(db); } if (dataInvalidated) { } } public static void deleteDatabase(Context context) { context.deleteDatabase(DATABASE_NAME); } }