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<String, String> sNotesProjectionMap;
    private static HashMap<String, String> sUsersProjectionMap;
    private static HashMap<String, String> sKeysProjectionMap;
    private static HashMap<String, String> 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<String, String>();
        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<String, String>();
        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<String, String>();
        sKeysProjectionMap.put(Key._ID, Key._ID);
        sKeysProjectionMap.put(Key.KEY, Key.KEY);
       
        sWidgetProjectionMap = new HashMap<String, String>();
        sWidgetProjectionMap.put(WidgetColumns._ID, WidgetColumns._ID);
        sWidgetProjectionMap.put(WidgetColumns.NOTEID, WidgetColumns.NOTEID);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android ContentProvider是Android系统的一个组件,用于管理应用程序之间的数据共享。它提供了一种标准的接口,使得应用程序可以访问其他应用程序的数据,同时也可以保护数据的安全性。ContentProvider可以将数据存储在文件系统、SQLite数据库或者网络上,然后通过URI来访问这些数据。开发者可以通过继承ContentProvider类来创建自己的ContentProvider,然后在AndroidManifest.xml文件注册。在使用ContentProvider时,需要使用ContentResolver类来访问数据。 ### 回答2: Android ContentProvider是Android Framework的一个重要组件,用于在应用间共享数据。它提供一种标准化的方式,让其它应用或组件访问原本受到封装的私有数据。ContentProvider采用标准的CRUD(Create、Retrieve、Update、Delete)逻辑来管理数据,且提供额外的查询功能,是实现数据在应用间共享的理想选择。 ContentProvider可以用来实现以下几个功能: 1. 数据共享:ContentProvider提供了一个标准的接口,让其它应用或组件来操作内容提供者的数据。 2. 数据访问保护:ContentProvider可以控制其它应用或组件只有在得到授权的情况下才能访问数据。 3. 储存树形数据:储存树形数据是很常见的需求,不像SQLite那样的关系型数据库。 4. 数据访问审计:作为应用的一个央存储库,ContentProvider可以记录其它应用或组件对它的操作记录。 下面以一个简单的例子来说明ContentProvider的使用过程: 1. 首先在AndroidManifest.xml文件定义ContentProvider,必须在所有Activity的前面定义; 2. 在代码继承ContentProvider,实现CRUD和查询方法; 3. 在应用使用CursorLoader或ContentResolver访问ContentProvider的数据; 4. 客户端进程和服务端进程都需要读写ContentProvider,为了防止多线程数据访问问题, ContentProvider通常会使用线程池来进行并发处理。 ContentProvider是Android组件的一种,应用程序可以通过该组件来暴露自己的数据给其它应用程序使用,同时也可以访问其它应用程序的ContentProvider,以获取到这些应用程序所提供的数据。ContentProvider实例在Android开发广泛运用。通过ContentProvider,我们可以更加方便地共享数据,能够让我们的应用程序变得更加灵活。 ### 回答3: Android提供了Content Provider框架,以便不同的应用程序之间共享数据。ContentProvider提供了一种安全访问数据的方式,防止数据被未经授权的访问。 实现Content Provider需要定义一个类,该类继承自ContentProvider类,并实现一些必要的方法,包括onCreate()、query()、insert()、update()和delete()。我们可以通过Content Resolver类来访问Content Provider,它是一个用于查询、插入、更新和删除数据的类。 Content Provider的最大好处是在应用程序之间共享数据。例如,一个应用程序可以提供联系人列表,并允许其他应用程序访问该列表。如果应用程序需要共享数据,可以使用Content Provider。 在实现Content Provider时,需要确定好URI的结构,以便其他应用程序访问数据。URI的结构可以根据应用程序的需求来定制。例如,我想创建一个共享书籍列表的Content Provider,URI可以定义为content://com.example.bookprovider/books。通过这个URI,其他应用程序可以访问该Provider的books表,并操作数据。 要使用Content Provider,需要先在AndroidManifest.xml文件注册该Provider。这需要声明一个<provider>标记,其包含Provider的名称、权限和URI。 Content Provider在Android被广泛使用,它可以让应用程序之间共享数据,并提高应用程序的安全性。但是,使用Content Provider也需要注意数据安全性,防止数据被未经授权的访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值