ContentProvider模板

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;
            }
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值