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;
            }
        }
    }
【SCI复现】含可再生能源与储能的区域微电网最优运行:应对不确定性的解鲁棒性与非预见性研究(Matlab代码实现)内容概要:本文围绕含可再生能源与储能的区域微电网最优运行展开研究,重点探讨应对不确定性的解鲁棒性与非预见性策略,通过Matlab代码实现SCI论文复现。研究涵盖多阶段鲁棒调度模型、机会约束规划、需求响应机制及储能系统优化配置,结合风电、光伏等可再生能源出力的不确定性建模,提出兼顾系统经济性与鲁棒性的优化运行方案。文中详细展示了模型构建、算法设计(如C&CG算法、大M法)及仿真验证全过程,适用于微电网能量管理、电力系统优化调度等领域的科研与工程实践。; 适合人群:具备一定电力系统、优化理论和Matlab编程基础的研究生、科研人员及从事微电网、能源管理相关工作的工程技术人员。; 使用场景及目标:①复现SCI级微电网鲁棒优化研究成果,掌握应对风光负荷不确定性的建模与求解方法;②深入理解两阶段鲁棒优化、分布鲁棒优化、机会约束规划等先进优化方法在能源系统中的实际应用;③为撰写高水平学术论文或开展相关课题研究提供代码参考和技术支持。; 阅读建议:建议读者结合文档提供的Matlab代码逐模块学习,重点关注不确定性建模、鲁棒优化模型构建与求解流程,并尝试在不同场景下调试与扩展代码,以深化对微电网优化运行机制的理解。
个人防护装备实例分割数据集 一、基础信息 数据集名称:个人防护装备实例分割数据集 图片数量: 训练集:4,524张图片 分类类别: - Gloves(手套):工作人员佩戴的手部防护装备。 - Helmet(安全帽):头部防护装备。 - No-Gloves(未戴手套):未佩戴手部防护的状态。 - No-Helmet(未戴安全帽):未佩戴头部防护的状态。 - No-Shoes(未穿安全鞋):未佩戴足部防护的状态。 - No-Vest(未穿安全背心):未佩戴身体防护的状态。 - Shoes(安全鞋):足部防护装备。 - Vest(安全背心):身体防护装备。 标注格式:YOLO格式,包含实例分割的多边形坐标和类别标签,适用于实例分割任务。 数据格式:来源于实际场景图像,适用于计算机视觉模型训练。 二、适用场景 工作场所安全监控系统开发:数据集支持实例分割任务,帮助构建能够自动识别工作人员个人防护装备穿戴状态的AI模型,提升工作环境安全性。 建筑与工业安全检查:集成至监控系统,实时检测PPE穿戴情况,预防安全事故,确保合规性。 学术研究与创新:支持计算机视觉在职业安全领域的应用研究,促进AI与安全工程的结合。 培训与教育:可用于安全培训课程,演示PPE识别技术,增强员工安全意识。 三、数据集优势 精准标注与多样性:每个实例均用多边形精确标注,确保分割边界准确;覆盖多种PPE物品及未穿戴状态,增加模型鲁棒性。 场景丰富:数据来源于多样环境,提升模型在不同场景下的泛化能力。 任务适配性强:标注兼容主流深度学习框架(如YOLO),可直接用于实例分割模型开发,支持目标检测和分割任务。 实用价值高:专注于工作场所安全,为自动化的PPE检测提供可靠数据支撑,有助于减少工伤事故。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值