MyNotes(ContentProvider实例)

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);
    }
}

你可能感兴趣的:(Android)