ContentProvider模板

来源:互联网 发布:知乎匿名提问在哪里看 编辑:程序博客网 时间:2024/06/07 01:20
package com.lenovo.seeplus.provider;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;public class DatabaseHelper extends SQLiteOpenHelper {    public static final String DATABASE_NAME = "seeplus.db";    public static final int DATABASE_VERSION = 1;    public DatabaseHelper(Context context) {        super(context, DATABASE_NAME, null, DATABASE_VERSION);    }    @Override    public void onCreate(SQLiteDatabase db) {        db.execSQL("create table if not exists " + Provider.UserColumns.TABLE_NAME + "("                + Provider.UserColumns._ID + " integer primary key autoincrement,"                + Provider.UserColumns.USERNAME + " text,"//username                + Provider.UserColumns.BOOTH_STATUS + " int default 0,"//1-yes,0-no                + Provider.UserColumns.AVATAR + " blob,"//avatar bytes                + Provider.UserColumns.CURRENT_USER + " int default 0," //1-current                + Provider.UserColumns.PATH + " text,"//embeddings.txt path                + Provider.UserColumns.TIMESTAMPS + " long,"//create time                + Provider.UserColumns.SENDER + " text,"//contact name                + Provider.UserColumns.MESSAGE + " text);");//message content        db.execSQL("create table if not exists " + Provider.EventColumns.TABLE_NAME + "("                + Provider.EventColumns._ID + " integer primary key autoincrement,"                + Provider.EventColumns.USER_ID + " integer not null,"//userId                + Provider.EventColumns.TITLE + " text,"//event title                + Provider.EventColumns.DATE + " long,"//event date                + Provider.EventColumns.STARTTIME + " text,"//16:00                + Provider.EventColumns.ENDTTIME + " text,"//17:00                + Provider.EventColumns.LOCATION + " text);");//event location    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        db.execSQL("drop table if exists " + Provider.UserColumns.TABLE_NAME);        db.execSQL("drop table if exists " + Provider.EventColumns.TABLE_NAME);        onCreate(db);    }}
package com.lenovo.seeplus.provider;import android.net.Uri;import android.provider.BaseColumns;public class Provider {    public static final String AUTHORITY = "com.lenovo.seeplus";    public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.lenovo.seeplus";    public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.lenovo.seeplus";    public static final class UserColumns implements BaseColumns {        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/user");        public static final String TABLE_NAME = "user";        public static final String USERNAME = "username";        public static final String BOOTH_STATUS = "booth_status";        public static final String TIMESTAMPS = "timestamps";        public static final String MESSAGE = "message";        public static final String SENDER = "sender";        public static final String AVATAR = "avatar";        public static final String CURRENT_USER = "current_user";        public static final String PATH = "path";    }    public static final class EventColumns implements BaseColumns {        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/event");        public static final String TABLE_NAME = "event";        public static final String USER_ID = "userId";        public static final String TITLE = "title";        public static final String DATE = "date";        public static final String STARTTIME = "starttime";        public static final String ENDTTIME = "endtime";        public static final String LOCATION = "location";    }}
package com.lenovo.seeplus.provider;import android.content.ContentProvider;import android.content.ContentUris;import android.content.ContentValues;import android.content.UriMatcher;import android.database.Cursor;import android.database.SQLException;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteQueryBuilder;import android.net.Uri;import android.text.TextUtils;import android.util.Log;import java.util.HashMap;public class UserProvider extends ContentProvider {    private static final String TAG = UserProvider.class.getSimpleName();    private static final int USER = 1;    private static final int USER_ID = 2;    private static final int EVENT = 3;    private static final int EVENT_ID = 4;    private static final UriMatcher uriMatcher;    private static HashMap<String, String> mUserProjectionMap;    private static HashMap<String, String> mEventProjectionMap;    static {        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);        uriMatcher.addURI(Provider.AUTHORITY, "user", USER);        uriMatcher.addURI(Provider.AUTHORITY, "user/#", USER_ID);        // 这里要增加另一张表的匹配项        uriMatcher.addURI(Provider.AUTHORITY, "event", EVENT);        uriMatcher.addURI(Provider.AUTHORITY, "event/#", EVENT_ID);        // 保存所有表用到的字段        mUserProjectionMap = new HashMap<>();        mUserProjectionMap.put(Provider.UserColumns._ID, Provider.UserColumns._ID);        mUserProjectionMap.put(Provider.UserColumns.USERNAME, Provider.UserColumns.USERNAME);        mUserProjectionMap.put(Provider.UserColumns.MESSAGE, Provider.UserColumns.MESSAGE);        mUserProjectionMap.put(Provider.UserColumns.SENDER, Provider.UserColumns.SENDER);        mUserProjectionMap.put(Provider.UserColumns.AVATAR, Provider.UserColumns.AVATAR);        mUserProjectionMap.put(Provider.UserColumns.TIMESTAMPS, Provider.UserColumns.TIMESTAMPS);        mUserProjectionMap.put(Provider.UserColumns.CURRENT_USER, Provider.UserColumns.CURRENT_USER);        mUserProjectionMap.put(Provider.UserColumns.BOOTH_STATUS, Provider.UserColumns.BOOTH_STATUS);        mUserProjectionMap.put(Provider.UserColumns.PATH, Provider.UserColumns.PATH);        mEventProjectionMap = new HashMap<>();        mEventProjectionMap.put(Provider.EventColumns._ID, Provider.EventColumns._ID);        mEventProjectionMap.put(Provider.EventColumns.USER_ID, Provider.EventColumns.USER_ID);        mEventProjectionMap.put(Provider.EventColumns.TITLE, Provider.EventColumns.TITLE);        mEventProjectionMap.put(Provider.EventColumns.STARTTIME, Provider.EventColumns.STARTTIME);        mEventProjectionMap.put(Provider.EventColumns.ENDTTIME, Provider.EventColumns.ENDTTIME);        mEventProjectionMap.put(Provider.EventColumns.LOCATION, Provider.EventColumns.LOCATION);        mEventProjectionMap.put(Provider.EventColumns.DATE, Provider.EventColumns.DATE);    }    private DatabaseHelper dbHelper = null;    @Override    public boolean onCreate() {        Log.i(TAG, "Provider Create");        dbHelper = new DatabaseHelper(getContext());        return true;    }    @Override    public String getType(Uri uri) {        switch (uriMatcher.match(uri)) { // 这里也要增加匹配项            case USER:            case EVENT:                return Provider.CONTENT_TYPE;            case USER_ID:            case EVENT_ID:                return Provider.CONTENT_ITEM_TYPE;            default:                throw new IllegalArgumentException("Unknown URI " + uri);        }    }    @Override    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();        String orderBy;        switch (uriMatcher.match(uri)) { // 这里要对不同表的匹配结果做不同处理            case USER:            case USER_ID:                qb.setTables(Provider.UserColumns.TABLE_NAME);                // If no sort order is specified use the default                orderBy = sortOrder;                break;            case EVENT:            case EVENT_ID:                qb.setTables(Provider.EventColumns.TABLE_NAME);                // If no sort order is specified use the default                orderBy = sortOrder;                break;            default:                throw new IllegalArgumentException("Unknown URI " + uri);        }        switch (uriMatcher.match(uri)) {            case USER:                qb.setProjectionMap(mUserProjectionMap);                break;            case EVENT:                qb.setProjectionMap(mEventProjectionMap);                break;            case USER_ID:                qb.setProjectionMap(mUserProjectionMap);                qb.appendWhere(Provider.UserColumns._ID + "=" + uri.getPathSegments().get(1));                break;            case EVENT_ID:                qb.setProjectionMap(mEventProjectionMap);                qb.appendWhere(Provider.EventColumns._ID + "=" + uri.getPathSegments().get(1));                break;            default:                throw new IllegalArgumentException("Unknown URI " + uri);        }        // Get the database and run the query        SQLiteDatabase db = dbHelper.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 Uri insert(Uri uri, ContentValues initialValues) {        ContentValues values;        if (initialValues != null) {            values = initialValues;        } else {            values = new ContentValues();        }        String tableName;        switch (uriMatcher.match(uri)) { // 这里要对不同表的匹配结果做不同处理            case USER:                tableName = Provider.UserColumns.TABLE_NAME;                break;            case EVENT:                tableName = Provider.EventColumns.TABLE_NAME;                break;            default:                // Validate the requested uri                throw new IllegalArgumentException("Unknown URI " + uri);        }        SQLiteDatabase db = dbHelper.getWritableDatabase();        long rowId = db.insert(tableName, null, values);        if (rowId > 0) {            Uri noteUri = ContentUris.withAppendedId(uri, rowId);            getContext().getContentResolver().notifyChange(noteUri, null);            return noteUri;        }        throw new SQLException("Failed to insert row into " + uri);    }    @Override    public int delete(Uri uri, String where, String[] whereArgs) {        SQLiteDatabase db = dbHelper.getWritableDatabase();        int count;        switch (uriMatcher.match(uri)) { // 这里要对不同表的匹配结果做不同处理,注意下面用到的表名不要弄错了            case USER:                count = db.delete(Provider.UserColumns.TABLE_NAME, where, whereArgs);                break;            case USER_ID:                String userId = uri.getPathSegments().get(1);                count = db.delete(Provider.UserColumns.TABLE_NAME, Provider.UserColumns._ID + "=" + userId                        + (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);                break;            case EVENT:                count = db.delete(Provider.EventColumns.TABLE_NAME, where, whereArgs);                break;            case EVENT_ID:                String eventId = uri.getPathSegments().get(1);                count = db.delete(Provider.EventColumns.TABLE_NAME, Provider.EventColumns._ID + "=" + eventId                        + (!TextUtils.isEmpty(where) ? " AND (" + 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 = dbHelper.getWritableDatabase();        int count;        switch (uriMatcher.match(uri)) { // 这里要对不同表的匹配结果做不同处理,注意下面用到的表名不要弄错了            case USER:                count = db.update(Provider.UserColumns.TABLE_NAME, values, where, whereArgs);                break;            case USER_ID:                String userId = uri.getPathSegments().get(1);                count = db.update(Provider.UserColumns.TABLE_NAME, values, Provider.UserColumns._ID + "=" + userId                        + (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);                break;            case EVENT:                count = db.update(Provider.EventColumns.TABLE_NAME, values, where, whereArgs);                break;            case EVENT_ID:                String eventId = uri.getPathSegments().get(1);                count = db.update(Provider.EventColumns.TABLE_NAME, values, Provider.EventColumns._ID + "=" + eventId                        + (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);                break;            default:                throw new IllegalArgumentException("Unknown URI " + uri);        }        getContext().getContentResolver().notifyChange(uri, null);        return count;    }}

关于A SQLiteConnection object for database ‘/data/dbstar/xxx.db’ was leaked! 的解决办法:及时释放Cursor和SQLiteDatabase对象。如下finally模块所示:

private long save2DB(String path) {        DatabaseHelper helper = new DatabaseHelper(this);        SQLiteDatabase db = helper.getReadableDatabase();        long userId = 0;        try {            ContentValues values = new ContentValues();            values.put(Provider.UserColumns.USERNAME, username);            values.put(Provider.UserColumns.TIMESTAMPS, System.currentTimeMillis());            values.put(Provider.UserColumns.SENDER, sender);            values.put(Provider.UserColumns.MESSAGE, message);            values.put(Provider.UserColumns.AVATAR, bitmapBytes);            values.put(Provider.UserColumns.PATH, path);            db.execSQL("update " + Provider.UserColumns.TABLE_NAME + " set " + Provider.UserColumns.CURRENT_USER + "=0 where " + Provider.UserColumns.CURRENT_USER + "=1");            values.put(Provider.UserColumns.CURRENT_USER, 1);            userId = db.insert(Provider.UserColumns.TABLE_NAME, null, values);            long date = 0;            switch (event_date) {                case "今天":                    date = System.currentTimeMillis();                    break;                case "明天":                    date = System.currentTimeMillis() + 24 * 60 * 60 * 1000;                    break;                case "后天":                    date = System.currentTimeMillis() + 24 * 60 * 60 * 1000 * 2;                    break;            }            for (int i = 0; i < lv_event_list.getAdapter().getCount(); i++) {                ContentValues cv = new ContentValues();                Event event = eventList.get(i);                Log.i(TAG, event.toString());                cv.put(Provider.EventColumns.USER_ID, userId);                cv.put(Provider.EventColumns.TITLE, event.getTitle());                cv.put(Provider.EventColumns.STARTTIME, event.getStarttime());                cv.put(Provider.EventColumns.DATE, date);                long eventId = db.insert(Provider.EventColumns.TABLE_NAME, null, cv);                Log.i(TAG, "eventId = " + eventId);            }        } catch (SQLException e) {            e.printStackTrace();        } finally {            if (db != null && db.isOpen()) {                db.close();                db = null;            }        }        return userId;    }
private void initEventList() {        DatabaseHelper helper = new DatabaseHelper(this);        SQLiteDatabase db = helper.getWritableDatabase();        Cursor cursor = null;        try {            cursor = db.query(Provider.EventColumns.TABLE_NAME, null, Provider.EventColumns.USER_ID + "=?", new String[]{String.valueOf(mUserId)}, null, null, null);            if (cursor != null) {                eventList.clear();                while (cursor.moveToNext()) {                    String title = cursor.getString(cursor.getColumnIndex(Provider.EventColumns.TITLE));                    String startTime = cursor.getString(cursor.getColumnIndex(Provider.EventColumns.STARTTIME));                    mEventDate = cursor.getLong(cursor.getColumnIndex(Provider.EventColumns.DATE));                    Event event = new Event();                    event.setTitle(title);                    event.setStarttime(startTime);                    eventList.add(event);                }            }        } catch (Exception e) {            e.printStackTrace();        } finally {            if (cursor != null) {                cursor.close();            }            if (db != null && db.isOpen()) {                db.close();                db = null;            }        }    }