package com.android.notes;

import java.util.Calendar;
import java.util.HashMap;

import javax.crypto.SecretKey;

import com.android.provider.Notes;
import com.android.provider.Notes.Key;
import com.android.provider.Notes.Note;
import com.android.provider.Notes.User;
import com.android.provider.Notes.WidgetColumns;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.content.res.Resources;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.provider.Contacts.Groups;
import android.text.TextUtils;
import android.util.Log;

public class NotesProvider extends ContentProvider{

    private static final String TAG = "NotesProvider";

    private static final String DATABASE_NAME = "notes.db";
    private static final int DATABASE_VERSION = 2;
    private static final String NOTES_TABLE_NAME = "note";
    private static final String USER_TABLE_NAME = "user";
    private static final String KEY_TABLE_NAME = "key";
    private static final String WIDGET_TABLE_NAME = "widget_provider";

    private static HashMap sNotesProjectionMap;
    private static HashMap sUsersProjectionMap;
    private static HashMap sKeysProjectionMap;
    private static HashMap sWidgetProjectionMap;

    private static final int NOTES = 1;
    private static final int NOTE_ID = 2;
    private static final int USERS = 3;
    private static final int USER_ID = 4;
    private static final int KEYS = 5;
    private static final int WIDGETS = 6;
   
    private static final UriMatcher sUriMatcher;     
   
    /**
     * This class helps open, create, and upgrade the database file.
     */
    public static class DatabaseHelper extends SQLiteOpenHelper {

//        public static SecretKey KEY;
        DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
           
            System.out.println("*********************************************The first time create db");
           
            db.execSQL("CREATE TABLE " + USER_TABLE_NAME + " ("
                    + User._ID + " INTEGER PRIMARY KEY,"
                    + User.NAME + " TEXT,"
                    + User.PASSWORD + " TEXT,"
                    + User.QUESTION + " TEXT,"                   
                    + User.ANSWER + " TEXT,"    
                    + User.CREATE_DATE + " TEXT"
                    + ");");
           
            db.execSQL("CREATE TABLE  " + NOTES_TABLE_NAME + " ("
                    + Note._ID + " INTEGER PRIMARY KEY,"
                    + Note.TITLE + " TEXT,"
                    + Note.CONTENT + " TEXT,"
                    + Note.MODIFIED_DATE + " TEXT,"
                    + Note.ACCESS + " TEXT,"
                    + Note.HOUR + " INTEGER,"
                    + Note.MINUTE + " INTEGER,"                  
                    + Note.USER + " INTEGER REFERENCES user(_id)"
                    + ");"); 
           
            db.execSQL("CREATE TABLE key(_id INTEGER PRIMARY KEY, key TEXT);");      
           
            db.execSQL("CREATE TABLE  " + WIDGET_TABLE_NAME + " ("
                    + WidgetColumns._ID + " INTEGER PRIMARY KEY,"
                    + WidgetColumns.NOTEID + " INTEGER REFERENCES note(_id)"
                    + ");");

        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                    + newVersion + ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS note");
            db.execSQL("DROP TABLE IF EXISTS user");
            db.execSQL("DROP TABLE IF EXISTS key");
            db.execSQL("DROP TABLE IF EXISTS widget_provider");
            onCreate(db);
        }
    }

    private DatabaseHelper mOpenHelper;

    @Override
    public boolean onCreate() {
        mOpenHelper = new DatabaseHelper(getContext());
        return true;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
            String sortOrder) {
        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();

        switch (sUriMatcher.match(uri)) {
        case NOTES:
            qb.setTables(NOTES_TABLE_NAME);
            qb.setProjectionMap(sNotesProjectionMap);
            break;

        case NOTE_ID:
            qb.setTables(NOTES_TABLE_NAME);
            qb.setProjectionMap(sNotesProjectionMap);
            qb.appendWhere(Note._ID + "=" + uri.getPathSegments().get(1));
            break;
           
        case USERS:
            qb.setTables(USER_TABLE_NAME);
            qb.setProjectionMap(sUsersProjectionMap);
            break;
           
        case USER_ID:
            qb.setTables(USER_TABLE_NAME);
            qb.setProjectionMap(sUsersProjectionMap);
            qb.appendWhere(User._ID + "=" + uri.getPathSegments().get(1));
            break;     
       
        case KEYS:
            qb.setTables(KEY_TABLE_NAME);
            qb.setProjectionMap(sKeysProjectionMap);           
            break;
        case WIDGETS:
            qb.setTables(WIDGET_TABLE_NAME);
            qb.setProjectionMap(sWidgetProjectionMap);
            break;
        default:
            throw new IllegalArgumentException("Unknown URI " + uri);
        }

        // If no sort order is specified use the default
        String orderBy;
        if (TextUtils.isEmpty(sortOrder)) {
            orderBy = Notes.Note.DEFAULT_SORT_ORDER;
        } else {
            orderBy = sortOrder;
        }

        // Get the database and run the query
        SQLiteDatabase db = mOpenHelper.getReadableDatabase();
        Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);

        // Tell the cursor what uri to watch, so it knows when its source data changes
        c.setNotificationUri(getContext().getContentResolver(), uri);
        return c;
    }

    @Override
    public String getType(Uri uri) {
        switch (sUriMatcher.match(uri)) {
        case NOTES:
            return Note.CONTENT_TYPE;

        case NOTE_ID:
            return Note.CONTENT_ITEM_TYPE;
           
        case USERS:
            return User.CONTENT_TYPE;
           
        case USER_ID:
            return User.CONTENT_ITEM_TYPE;
           
        case KEYS:
            return Key.CONTENT_TYPE;
        case WIDGETS:
            return WidgetColumns.CONTENT_TYPE;
        default:
            throw new IllegalArgumentException("Unknown URI " + uri);
        }
    }

    private StringBuffer date;
    public void setDate(){
        Calendar calendar=Calendar.getInstance();
        int year=calendar.get(Calendar.YEAR);        
        int month=calendar.get(Calendar.MONTH)+1;       
        int day=calendar.get(Calendar.DATE);
        int t=calendar.get(Calendar.DAY_OF_WEEK);
        String week[] = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
        String tmpYear = "年";
        String tmpMonth = "月";
        String tmpDay = "日";
        date=new StringBuffer();
        date.append(year);
        if(month<10)
            date.append(tmpYear + "0");
        else
            date.append(tmpYear);
        date.append(month);
        if(day<10)
            date.append(tmpMonth + "0");
        else
            date.append(tmpMonth);
        date.append(day);
        date.append(tmpDay);
        date.append(" ");
        date.append(week[t-1]);
    }
   
    @Override
    public Uri insert(Uri uri, ContentValues initialValues) {
        setDate();
        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        ContentValues values;
        if (initialValues != null) {
            values = new ContentValues(initialValues);
        } else {
            values = new ContentValues();
        }   
        if (sUriMatcher.match(uri) == NOTES){
            // Make sure that the fields are all set
            if (values.containsKey(Note.MODIFIED_DATE) == false) {
                values.put(Note.MODIFIED_DATE, date.toString());
            }

            if (values.containsKey(Note.TITLE) == false) {
                Resources r = Resources.getSystem();
                values.put(Note.TITLE, r.getString(R.string.untitled));
            }

            if (values.containsKey(Note.CONTENT) == false) {
                values.put(Note.CONTENT, "");
            }
           
            if (values.containsKey(Note.ACCESS) == false) {
                values.put(Note.ACCESS, "");
            }
            if (values.containsKey(Note.USER) == false) {
                values.put(Note.USER, "0");
            }      
          
            long rowId = db.insert(NOTES_TABLE_NAME, Note.TITLE, values);
            if (rowId > 0) {
                Uri noteUri = ContentUris.withAppendedId(Note.CONTENT_URI, rowId);
                getContext().getContentResolver().notifyChange(noteUri, null);
                return noteUri;
            }           
        }else if (sUriMatcher.match(uri) == USERS){
             // Make sure that the fields are all set
            if (values.containsKey(User.CREATE_DATE) == false) {
                values.put(User.CREATE_DATE, date.toString());
            }

            if (values.containsKey(User.NAME) == false) {
                Resources r = Resources.getSystem();
                values.put(User.NAME, r.getString(R.string.no_user));
            }

            if (values.containsKey(User.PASSWORD) == false) {
                values.put(User.PASSWORD, "");
            }
           
            if (values.containsKey(User.QUESTION) == false) {
                values.put(User.QUESTION, "");
            }
            if (values.containsKey(User.ANSWER) == false) {
                values.put(User.ANSWER, "");
            }      
          
            long rowId = db.insert(USER_TABLE_NAME, User.NAME, values);
            if (rowId > 0) {
                Uri userUri = ContentUris.withAppendedId(User.CONTENT_URI, rowId);
                getContext().getContentResolver().notifyChange(userUri, null);
                return userUri;
            }
        }else if (sUriMatcher.match(uri) == KEYS){
            if (values.containsKey(Key.KEY) == false){
                values.put(Key.KEY, " ");
            }
            long rowId = db.insert(KEY_TABLE_NAME, Key.KEY, values);
            if (rowId > 0){
                Uri keyUri = ContentUris.withAppendedId(Key.CONTENT_URI, rowId);
                getContext().getContentResolver().notifyChange(keyUri, null);
                return keyUri;
            }
        }else if (sUriMatcher.match(uri) == WIDGETS){
            if (values.containsKey(WidgetColumns._ID) == false){
                values.put(WidgetColumns._ID,  " ");
            }
            long rowId = db.insert(WIDGET_TABLE_NAME, WidgetColumns._ID, values);
            if (rowId > 0){
                Uri widgetUri = ContentUris.withAppendedId(WidgetColumns.CONTENT_URI, rowId);
                getContext().getContentResolver().notifyChange(widgetUri, null);
                return widgetUri;
            }
        }
        throw new SQLException("Failed to insert row into " + uri);
    }

   
    @Override
    public int delete(Uri uri, String where, String[] whereArgs) {
        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        int count;
        switch (sUriMatcher.match(uri)) {
        case NOTES:
            count = db.delete(NOTES_TABLE_NAME, where, whereArgs);
            break;

        case NOTE_ID:
            String noteId = uri.getPathSegments().get(1);
            count = db.delete(NOTES_TABLE_NAME, Note._ID + "=" + noteId
                    + (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);
            break;

        case USERS:
            count = db.delete(USER_TABLE_NAME, where, whereArgs);
            break;
           
        case USER_ID:
            String userId = uri.getPathSegments().get(1);
            count = db.delete(USER_TABLE_NAME, User._ID + "=" + userId
                    + (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);
            break;
           
        case KEYS:
            count = db.delete(KEY_TABLE_NAME, where, whereArgs);
            break;
        case WIDGETS:
            count = db.delete(WIDGET_TABLE_NAME, where, whereArgs);
            break;
        default:
            throw new IllegalArgumentException("Unknown URI " + uri);
        }
       
        getContext().getContentResolver().notifyChange(uri, null);
        return count;
    }

    @Override
    public int update(Uri uri, ContentValues values, String where, String[] whereArgs) {
        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        int count;
        switch (sUriMatcher.match(uri)) {
        case NOTES:
            count = db.update(NOTES_TABLE_NAME, values, where, whereArgs);
            break;

        case NOTE_ID:
            String noteId = uri.getPathSegments().get(1);
            count = db.update(NOTES_TABLE_NAME, values, Note._ID + "=" + noteId
                    + (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);
            break;
           
        case USERS:
            count = db.update(USER_TABLE_NAME, values, where, whereArgs);
            break;
           
        case USER_ID:
            String userId = uri.getPathSegments().get(1);
            count = db.update(USER_TABLE_NAME, values, User._ID + "=" + userId
                    + (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);
            break;
           
        case KEYS:
            count = db.update(KEY_TABLE_NAME, values, where, whereArgs);
            break;
        case WIDGETS:
            count = db.update(WIDGET_TABLE_NAME, values, where, whereArgs);
            break;
        default:
            throw new IllegalArgumentException("Unknown URI " + uri);
        }

        getContext().getContentResolver().notifyChange(uri, null);
        return count;
    }

    static {
        sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        sUriMatcher.addURI(Notes.AUTHORITY, "note", NOTES);
        sUriMatcher.addURI(Notes.AUTHORITY, "note/#", NOTE_ID);
        sUriMatcher.addURI(Notes.AUTHORITY, "user", USERS);
        sUriMatcher.addURI(Notes.AUTHORITY, "user/#", USER_ID);
        sUriMatcher.addURI(Notes.AUTHORITY, "key", KEYS);
        sUriMatcher.addURI(Notes.AUTHORITY, "widget", WIDGETS);

        sNotesProjectionMap = new HashMap();
        sNotesProjectionMap.put(Note._ID, Note._ID);
        sNotesProjectionMap.put(Note.TITLE, Note.TITLE);
        sNotesProjectionMap.put(Note.CONTENT, Note.CONTENT);
        sNotesProjectionMap.put(Note.ACCESS, Note.ACCESS);
        sNotesProjectionMap.put(Note.USER, Note.USER);
        sNotesProjectionMap.put(Note.MODIFIED_DATE, Note.MODIFIED_DATE);
        sNotesProjectionMap.put(Note.HOUR, Note.HOUR);
        sNotesProjectionMap.put(Note.MINUTE, Note.MINUTE);
     
        sUsersProjectionMap = new HashMap();
        sUsersProjectionMap.put(User._ID, User._ID);
        sUsersProjectionMap.put(User.NAME, User.NAME);
        sUsersProjectionMap.put(User.PASSWORD, User.PASSWORD);
        sUsersProjectionMap.put(User.QUESTION, User.QUESTION);
        sUsersProjectionMap.put(User.ANSWER, User.ANSWER);
        sUsersProjectionMap.put(User.CREATE_DATE, User.CREATE_DATE);  
       
        sKeysProjectionMap = new HashMap();
        sKeysProjectionMap.put(Key._ID, Key._ID);
        sKeysProjectionMap.put(Key.KEY, Key.KEY);
       
        sWidgetProjectionMap = new HashMap();
        sWidgetProjectionMap.put(WidgetColumns._ID, WidgetColumns._ID);
        sWidgetProjectionMap.put(WidgetColumns.NOTEID, WidgetColumns.NOTEID);
    }
}

更多相关文章

  1. Android实现聊天型笔记编辑器
  2. Android(安卓)Gson使用入门及GsonFormat插件的使用
  3. 如何修改Android系统默认时间
  4. android获取今天周几的示例
  5. android 工具类 DateUtil
  6. android 根据设置的日期获取星期几
  7. Android(安卓)中 AlertDialog 的多种创建方式(二)
  8. android 仿课程表,时间星期展示选择列表,简单易懂
  9. android小片段

随机推荐

  1. android动画效果演示
  2. Android创建项目
  3. android水平循环滚动控件使用详解
  4. android从网络获取图片
  5. Android NumberPickerDialog
  6. Android 拦截TextView中超链接点击事件
  7. 往Android Studio中导入项目时遇到Instal
  8. android 获取APP大小及其清理缓存内容
  9. 获取当前应用的版本号/应用名称
  10. android用听筒不断播放音乐