android基础巩固之内容提供者(Content Provider)

内容提供者的基本使用

本文的场景MusicServer提供数据库及内容提供者给其它应用使用,及观察数据库变化,好刷新自身应用的列表,ALiCocoMusicPlayer为第三方应用,其作用是为了使用ContentResolover对MusicServer中数据库中的表进行操作。

MusicServer

db,dao,测试类代码

db

public class MusicDBHelper extends BaseSqliteDbHelper {
    public MusicDBHelper(Context context) {
        super(context, MusicAppConst.KEYSETS.MUSIC_DB_NAME, MusicAppConst.KEYSETS
                .MUSIC_DB_VERSION);
    }

    @Override
    protected String getDbCreateSql() {
        StringBuilder sqlSb = new StringBuilder();

        sqlSb.append("create table IF NOT EXISTS ").append(MusicTabinfo.TABLE_NAME).append(" (");
        sqlSb.append(MusicTabinfo.COLOUMN_NAME_ID).append(" integer primary key autoincrement , ");
        sqlSb.append(MusicTabinfo.COLOUMN_NAME_MUSIC_NAME).append(" varchar(20) , ");
        sqlSb.append(MusicTabinfo.COLOUMN_NAME_AUTHOR).append(" varchar(20) , ");
        sqlSb.append(MusicTabinfo.COLOUMN_NAME_PUBLISH_NAME).append(" varchar(30) ,");
        sqlSb.append(MusicTabinfo.COLOUMN_NAME_DESC).append(" text");
        sqlSb.append(" )");

        return sqlSb.toString();
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

dao

public class MusicDBDAO extends BaseDAO<MusicTabinfo> {
    private static MusicDBDAO INSTANCE = null;

    private MusicDBDAO() {
        mSqliteDbHelper = new MusicDBHelper(BaseApp.getAppInstance());
    }

    public static MusicDBDAO getInstance() {
        if (INSTANCE == null) {
            synchronized (MusicDBDAO.class) {
                if (INSTANCE == null) {
                    INSTANCE = new MusicDBDAO();
                }
            }
        }
        return INSTANCE;
    }

    @Override
    public int add(MusicTabinfo musicTabinfo) {
        LoggerUtils.loge("add");
        if (musicTabinfo == null)
            return -1;

        sqlBuilder.setLength(0);
        sqlBuilder.append("insert into ").append(MusicTabinfo.TABLE_NAME).append(" ( ");
        sqlBuilder.append(MusicTabinfo.COLOUMN_NAME_MUSIC_NAME).append(" , ");
        sqlBuilder.append(MusicTabinfo.COLOUMN_NAME_AUTHOR).append(" , ");
        sqlBuilder.append(MusicTabinfo.COLOUMN_NAME_PUBLISH_NAME).append(" , ");
        sqlBuilder.append(MusicTabinfo.COLOUMN_NAME_DESC).append(" ) values ( ");
        sqlBuilder.append("?,?,?,? ) ");

        printLog();
        try {
            getWriteDb().execSQL(sqlBuilder.toString(), new String[]{
                    musicTabinfo.getMusicName(), musicTabinfo.getAuthor(), musicTabinfo
                    .getPublishTime(), musicTabinfo.getDesc()});
            return 0;
        } catch (SQLException e) {
            e.printStackTrace();
            return -1;
        }
    }


    @Override
    public int addAll(List<MusicTabinfo> list) {
        LoggerUtils.loge("addAll");
        int errorNum = 0;
        for (MusicTabinfo tabinfo : list) {
            try {
                add(tabinfo);
            } catch (Exception e) {
                e.printStackTrace();
                errorNum++;
            }
        }
        // 有出错则返回-1
        return (errorNum == 0 ? 0 : -1);
    }

    @Override
    public int delete(MusicTabinfo musicTabinfo) {
        LoggerUtils.loge("delete");
        sqlBuilder.setLength(0);

        sqlBuilder.append("delete from ").append(MusicTabinfo.TABLE_NAME);
        sqlBuilder.append(" where ").append(MusicTabinfo.COLOUMN_NAME_MUSIC_NAME).append(" = ? ");
        sqlBuilder.append(" & ").append(MusicTabinfo.COLOUMN_NAME_ID).append(" = ? ");
        printLog();

        try {
            getWriteDb().execSQL(sqlBuilder.toString(), new String[]{musicTabinfo.getMusicName(),
                    musicTabinfo.getMusicId() + ""});
            return 0;
        } catch (SQLException e) {
            e.printStackTrace();
            return -1;
        }
    }

    @Override
    public int deleteById(int id) {
        LoggerUtils.loge("deleteById");
        sqlBuilder.setLength(0);

        sqlBuilder.append("delete from ").append(MusicTabinfo.TABLE_NAME);
        sqlBuilder.append(" where ").append(MusicTabinfo.COLOUMN_NAME_ID).append(" = ? ");
        printLog();

        try {
            getWriteDb().execSQL(sqlBuilder.toString(), new String[]{id + ""});
            return 0;
        } catch (SQLException e) {
            e.printStackTrace();
            return -1;
        }
    }


    @Override
    public int update(MusicTabinfo musicTabinfo) {
        LoggerUtils.loge("update");
        if (musicTabinfo == null)
            return -1;
        sqlBuilder.setLength(0);


        // 先查询再更新避免没有设置的数据被清除掉了
        sqlBuilder.append("update ").append(MusicTabinfo.TABLE_NAME);
        sqlBuilder.append(" set ");
        sqlBuilder.append(MusicTabinfo.COLOUMN_NAME_AUTHOR).append(" = ? , ");
        sqlBuilder.append(MusicTabinfo.COLOUMN_NAME_PUBLISH_NAME).append(" = ? ,");
        sqlBuilder.append(MusicTabinfo.COLOUMN_NAME_DESC).append(" = ? ");
        sqlBuilder.append(" where ").append(MusicTabinfo.COLOUMN_NAME_MUSIC_NAME).append(" = ? ");

        try {
            printLog();
            getWriteDb().execSQL(sqlBuilder.toString(), new String[]{musicTabinfo.getAuthor(),
                    musicTabinfo.getPublishTime(), musicTabinfo.getDesc(), musicTabinfo
                    .getMusicName()});
            return 0;
        } catch (SQLException e) {
            e.printStackTrace();
            return -1;
        }
    }

    @Override
    public int updateById(int id, Map<String, Object> params) {
        LoggerUtils.loge("updateById");
        if (id == -1 || id == 0 || params == null || params.size() == 0)
            return -1;

        // 先查询在数据库中是否存在
        MusicTabinfo dbInfo = queryById(id);

        Set<String> keySet = params.keySet();
        if (dbInfo != null) {
            // 存在就更新
            fillTabData(params, dbInfo, keySet);

            sqlBuilder.setLength(0);
            sqlBuilder.append("update ").append(MusicTabinfo.TABLE_NAME);
            sqlBuilder.append(" set ");
            sqlBuilder.append(MusicTabinfo.COLOUMN_NAME_AUTHOR).append(" = ? , ");
            sqlBuilder.append(MusicTabinfo.COLOUMN_NAME_PUBLISH_NAME).append(" = ? , ");
            sqlBuilder.append(MusicTabinfo.COLOUMN_NAME_DESC).append(" = ? , ");
            sqlBuilder.append(MusicTabinfo.COLOUMN_NAME_MUSIC_NAME).append(" = ? ");
            sqlBuilder.append(" where ").append(MusicTabinfo.COLOUMN_NAME_ID).append(" = ?");
            printLog();
            try {
                getWriteDb().execSQL(sqlBuilder.toString(), new String[]{dbInfo.getAuthor(),
                        dbInfo.getPublishTime(), dbInfo.getDesc(), dbInfo.getMusicName(),
                        id + ""});
                return 0;
            } catch (SQLException e) {
                e.printStackTrace();
                return -1;
            }
        } else {
            // 不存在就创建,并插入数据库
            dbInfo = new MusicTabinfo();
            fillTabData(params, dbInfo, keySet);
            return add(dbInfo);
        }
    }

    private void fillTabData(Map<String, Object> params, MusicTabinfo dbInfo, Set<String> keySet) {
        // 数据库中不存在就添加到数据库中
        if (keySet.contains(MusicTabinfo.COLOUMN_NAME_AUTHOR)) {
            dbInfo.setAuthor((String) params.get(MusicTabinfo.COLOUMN_NAME_AUTHOR));
        }

        if (keySet.contains(MusicTabinfo.COLOUMN_NAME_PUBLISH_NAME)) {
            dbInfo.setPublishTime((String) params.get(MusicTabinfo.COLOUMN_NAME_PUBLISH_NAME));
        }

        if (keySet.contains(MusicTabinfo.COLOUMN_NAME_DESC)) {
            dbInfo.setDesc((String) params.get(MusicTabinfo.COLOUMN_NAME_DESC));
        }

        if (keySet.contains(MusicTabinfo.COLOUMN_NAME_MUSIC_NAME)) {
            dbInfo.setMusicName((String) params.get(MusicTabinfo.COLOUMN_NAME_MUSIC_NAME));
        }
    }


    @Override
    public MusicTabinfo queryById(int id) {
        LoggerUtils.loge("queryById");
        MusicTabinfo tabinfo = new MusicTabinfo();
        sqlBuilder.setLength(0);

        sqlBuilder.append("select * from ").append(MusicTabinfo.TABLE_NAME);
        sqlBuilder.append(" where ").append(MusicTabinfo.COLOUMN_NAME_ID).append(" = ?");

        Cursor cursor = null;
        try {
            cursor = getReadDb().rawQuery(sqlBuilder.toString(), new String[]{id + ""});
            cursor.moveToFirst();
            int _id = cursor.getInt(cursor.getColumnIndex(MusicTabinfo.COLOUMN_NAME_ID));
            String _name = cursor.getString(cursor.getColumnIndex(MusicTabinfo
                    .COLOUMN_NAME_MUSIC_NAME));
            String _author = cursor.getString(cursor.getColumnIndex(MusicTabinfo
                    .COLOUMN_NAME_AUTHOR));
            String _publish_time = cursor.getString(cursor.getColumnIndex(MusicTabinfo
                    .COLOUMN_NAME_PUBLISH_NAME));
            String _desc = cursor.getString(cursor.getColumnIndex(MusicTabinfo.COLOUMN_NAME_DESC));
            tabinfo = new MusicTabinfo(_id, _name, _publish_time, _author, _desc);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (cursor != null)
                cursor.close();
        }

        return tabinfo;
    }

    @Override
    public List<MusicTabinfo> queryAll() {
        LoggerUtils.loge("queryAll");
        Cursor cursor = getReadDb().rawQuery("select * from " + MusicTabinfo.TABLE_NAME, null);
        List<MusicTabinfo> list = new ArrayList<>();
        MusicTabinfo tabinfo = null;
        while (cursor.moveToNext()) {
            int _id = cursor.getInt(cursor.getColumnIndex(MusicTabinfo.COLOUMN_NAME_ID));
            String _name = cursor.getString(cursor.getColumnIndex(MusicTabinfo
                    .COLOUMN_NAME_MUSIC_NAME));
            String _author = cursor.getString(cursor.getColumnIndex(MusicTabinfo
                    .COLOUMN_NAME_AUTHOR));
            String _publish_time = cursor.getString(cursor.getColumnIndex(MusicTabinfo
                    .COLOUMN_NAME_PUBLISH_NAME));
            String _desc = cursor.getString(cursor.getColumnIndex(MusicTabinfo.COLOUMN_NAME_DESC));
            tabinfo = new MusicTabinfo(_id, _name, _publish_time, _author, _desc);
            list.add(tabinfo);
        }
        cursor.close();
        return list;
    }
}

测试类

@RunWith(AndroidJUnit4.class)
public class MusicDBDAOTest {

    private MusicDBDAO mDbdao;

    @Before
    public void setUp() throws Exception {
        mDbdao = MusicDBDAO.getInstance();
    }

    @Test
    public void add() {
        MusicTabinfo tabinfo = new MusicTabinfo();
        tabinfo.setMusicName("光辉岁月");
        tabinfo.setAuthor("boyone");
        tabinfo.setPublishTime("1983-12-31");
        tabinfo.setDesc("激情,青春,有活力");
        mDbdao.add(tabinfo);
    }

    @Test
    public void addAll() {
        List<MusicTabinfo> list = new ArrayList<>();
        MusicTabinfo tabinfo = new MusicTabinfo();
        tabinfo.setMusicName("光辉岁月");
        tabinfo.setAuthor("boyone");
        tabinfo.setPublishTime("1983-12-31");
        tabinfo.setDesc("激情,青春,有活力");
        list.add(tabinfo);

        tabinfo = new MusicTabinfo();
        tabinfo.setMusicName("追梦赤子心");
        tabinfo.setAuthor("gala");
        tabinfo.setPublishTime("1983-11-31");
        tabinfo.setDesc("奔放,激情");
        list.add(tabinfo);

        tabinfo = new MusicTabinfo();
        tabinfo.setMusicName("海阔天空");
        tabinfo.setAuthor("boyone");
        tabinfo.setPublishTime("1984-12-31");
        tabinfo.setDesc("用心向往");
        list.add(tabinfo);

        tabinfo = new MusicTabinfo();
        tabinfo.setMusicName("the mass");
        tabinfo.setAuthor("era");
        tabinfo.setPublishTime("1986-12-31");
        tabinfo.setDesc("暴力,突破");
        list.add(tabinfo);

        tabinfo = new MusicTabinfo();
        tabinfo.setMusicName("reborn");
        tabinfo.setAuthor("era");
        tabinfo.setPublishTime("1989-12-31");
        tabinfo.setDesc("重生,向往");
        list.add(tabinfo);

        mDbdao.addAll(list);
    }

    @Test
    public void delete() {
    }

    @Test
    public void deleteById() {
        mDbdao.deleteById(3);
    }

    @Test
    public void update() {
        MusicTabinfo tabinfo = new MusicTabinfo();
        tabinfo.setMusicName("光辉岁月2");
        tabinfo.setAuthor("boyone223");
        tabinfo.setPublishTime("1982-11-1");
        mDbdao.update(tabinfo);
    }

    @Test
    public void updateById() {
        Map<String, Object> param = new HashMap<>();
        param.put(MusicTabinfo.COLOUMN_NAME_MUSIC_NAME, "光辉岁月431");
        param.put(MusicTabinfo.COLOUMN_NAME_AUTHOR, "boyone155");
        param.put(MusicTabinfo.COLOUMN_NAME_PUBLISH_NAME, "1980-1-1");
        mDbdao.updateById(4, param);
    }

    @Test
    public void queryById() {
        MusicTabinfo tabinfo = mDbdao.queryById(2);
        LoggerUtils.loge(tabinfo.toString());
    }

    @Test
    public void queryAll() {
        List<MusicTabinfo> list = mDbdao.queryAll();
        if (list != null && list.size() > 0) {
            for (MusicTabinfo tabinfo : list) {
                LoggerUtils.loge(tabinfo.toString());
            }
        }
    }
}

content provider配置及源代码

public class MusicContentProvider extends ContentProvider {
    /**
     * URI匹配器
     */
    private static final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
    private static final int INSERT = 0;
    private static final int DELETE = 1;
    private static final int UPDATE = 2;
    private static final int SELECT = 3;
    private static final int SELECT_ONE = 4;
    private static String tabName = MusicTabinfo.TABLE_NAME;

    static {
        /**
         * 添加匹配规则
         */
        matcher.addURI(MusicAppConst.AUTHORIES_SERVER_CP, tabName + "/insert", INSERT);
        matcher.addURI(MusicAppConst.AUTHORIES_SERVER_CP, tabName + "/delete", DELETE);
        matcher.addURI(MusicAppConst.AUTHORIES_SERVER_CP, tabName + "/update", UPDATE);
        matcher.addURI(MusicAppConst.AUTHORIES_SERVER_CP, tabName + "/select", SELECT);
        // 允许携带参数:select * from _music where id = ?
        // query/# 后面就是匹配这个id
        matcher.addURI(MusicAppConst.AUTHORIES_SERVER_CP, tabName + "/query/#", SELECT_ONE);
    }

    private final String LOG_TAG = getClass().getSimpleName();
    private MusicDBHelper mDbHelper;
    private BaseApp appInstance;

    /**
     * 被创建的时候做一些初始化的操作
     */
    @Override
    public boolean onCreate() {
        log("onCreate appInstance = " + appInstance);
        appInstance = MusicServerApp.getAppInstance();
        mDbHelper = MusicServerApp.getDbHelper();
        return true;
    }

    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection,
                        @Nullable String[] selectionArgs, @Nullable String sortOrder) {
        log("query mDbHelper = " + mDbHelper + " , appInstance = " + appInstance);
        // 清单文件中注册不会走onreate方法,需要重新初始化
        reInitDb();
        int match = matchUri(uri);
        if (match == SELECT) {
            SQLiteDatabase database = mDbHelper.getReadableDatabase();
            // 由别人控制要查询哪些,这就是不用dao的原因,行为由用户自己控制
            Cursor cursor = database.query(tabName, projection, selection, selectionArgs, null,
                    null, sortOrder);
            // cursor不能关闭,由调用者关闭,要不然会把其它地方给坑死的
            return cursor;
        } else if (match == SELECT_ONE) {
            // 这里是根据id进行查询
            long id = ContentUris.parseId(uri);
            SQLiteDatabase database = mDbHelper.getReadableDatabase();
            // 由别人控制要查询哪些,这就是不用dao的原因,行为由用户自己控制
            Cursor cursor = database.query(tabName, projection, "music_id = ?", new String[]{id +
                            ""}, null, null,
                    sortOrder);
            // cursor不能关闭,由调用者关闭,要不然会把其它地方给坑死的
            return cursor;
        } else {
            printErrorUri();
        }
        return null;
    }

    private void reInitDb() {
        if (appInstance == null)
            appInstance = MusicServerApp.getAppInstance();
        if (mDbHelper == null) mDbHelper = MusicServerApp.getDbHelper();
    }

    private int matchUri(@NonNull Uri uri) {
        return matcher.match(uri);
    }

    private void printErrorUri() {
        log("请求的uri不匹配");
    }

    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        reInitDb();
        log("getType");
        //The returned MIME type should start with vnd.android.cursor.item for a single record,
        // or vnd.android.cursor.dir/ for multiple items
        int matchUri = matchUri(uri);
        if (matchUri == SELECT) {
            // 多条数据
            return "vnd.android.cursor.dir/" + tabName;
        } else if (matchUri == SELECT_ONE) {
            // 单条数据
            return "vnd.android.cursor.item/" + tabName;
        } else {
            printErrorUri();
        }
        return null;
    }

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
        reInitDb();
        log("insert");
        int matchUri = matchUri(uri);
        if (matchUri == INSERT) {
            SQLiteDatabase database = mDbHelper.getWritableDatabase();
            database.insert(tabName, null, values);
            // 通知内容观察者发生变化
            appInstance.getContentResolver().notifyChange(uri, null);
            // 数据库别关闭了,否则会出现问题
        } else {
            printErrorUri();
        }
        return null;
    }

    @Override
    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[]
            selectionArgs) {
        reInitDb();
        log("delete");
        int matchUri = matchUri(uri);
        if (matchUri == DELETE) {
            SQLiteDatabase database = mDbHelper.getWritableDatabase();
            database.delete(tabName, selection, selectionArgs);
            // 数据库别关闭了,否则会出现问题
            // 通知内容观察者发生变化
            appInstance.getContentResolver().notifyChange(uri, null);
        } else {
            printErrorUri();
        }
        return 0;
    }

    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection,
                      @Nullable String[] selectionArgs) {
        reInitDb();
        log("update");
        int matchUri = matchUri(uri);
        if (matchUri == UPDATE) {
            SQLiteDatabase database = mDbHelper.getWritableDatabase();
            database.update(tabName, values, selection, selectionArgs);
            // 数据库别关闭了,否则会出现问题
            // 通知内容观察者发生变化
            appInstance.getContentResolver().notifyChange(uri, null);
        } else {
            printErrorUri();
        }

        return 0;
    }

    private void log(String str) {
        LoggerUtils.loge(LOG_TAG + " " + str);
    }
}

第三方应用在调用的时候,query,insert中的db可能会空,需要重新初始化,这里是一个坑,明明在onCreate中定义了,但是调用的时候,对象均为空,原因暂时未找到,这里做了容错,不影响使用

xml中的配置

<provider
        android:authorities="com.cokuq.t_music"
        android:name=".provider.MusicContentProvider"
        android:exported="true"
        />

使用ContentObserver观察者观察数据库内容的变化

public class MainActivity extends BaseSampleActivity {

    @BindView(R.id.recyclerView)
    RecyclerView mRecyclerView;
    @BindView(R.id.rl_loading_view)
    View loadingView;
    private List<MusicTabinfo> mList = new ArrayList<>();
    private Disposable mDisposable;
    private MusicListAdapter mMusicListAdapter;

    @Override
    public void initView() {
        mRecyclerView.setLayoutManager(new LinearLayoutManager(mContext));

        mMusicListAdapter = new MusicListAdapter(mContext, mList);
        mRecyclerView.setAdapter(mMusicListAdapter);
    }

    @Override
    public void initData() {
        LoggerUtils.loge("initData");
        ThreadUtils.executeBySingleThread(() -> {
            // 注册观察者监听数据库的变化
            getContentResolver().registerContentObserver(Uri.parse("content://com.kuqi" +
                    ".provider_1/t_music"), true, new MusicDBObserver(mH));
        });
        loadPageData();
    }

    private void loadPageData() {
        List<MusicTabinfo> dbList = MusicDBDAO.getInstance().queryAll();
        // rxjava2 延迟10秒回调obsesrver
        mDisposable = RxUtils.createFlowableData(dbList)
                .delay(10, TimeUnit.SECONDS)
                .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
                .subscribe(_list -> {
                    LoggerUtils.loge("数据获取完毕,刷新界面");
                    mMusicListAdapter.setData(_list);
                    LoggerUtils.loge("刷新界面");
                    mMusicListAdapter.notifyItemRangeChanged(0, _list.size());
                    hideLoading();

                });
    }

    private void hideLoading() {
        if (loadingView.getVisibility() != View.GONE) {
            loadingView.setVisibility(View.GONE);
        }
    }

    @Override
    public int getContentId() {
        return R.layout.activity_main;
    }

    @Override
    protected void onDestroy() {
        if (mDisposable != null) {
            if (!mDisposable.isDisposed()) {
                mDisposable.dispose();
            }
        }
        super.onDestroy();
    }

    @OnClick({R.id.btn_refresh})
    public void onViewClick(View v) {
        showLoading();
        loadPageData();
    }

    private void showLoading() {
        if (loadingView.getVisibility() != View.VISIBLE) {
            loadingView.setVisibility(View.VISIBLE);
        }
    }

    /**
     * 数据库内容观察者
     */
    private class MusicDBObserver extends ContentObserver {
        public MusicDBObserver(Handler handler) {
            super(handler);
        }

        @Override
        public void onChange(boolean selfChange, Uri uri) {
            String host = uri.getHost();
            String path = uri.getPath();
            String scheme = uri.getScheme();
            String query = uri.getQuery();
            LoggerUtils.loge("MusicDBObserver onChange uri = " + uri.toString() + " threadId = "
                    + Thread.currentThread().getId());
            LoggerUtils.loge("MusicDBObserver onChange host = " + host + " , path = " + path + " " +
                    ", scheme = " + scheme + " , query = " + query);
            if (EmptyUtils.isNotEmpty(path)) {
                path = path.substring(path.lastIndexOf("/") + 1, path.length());
                LoggerUtils.loge("path = " + path);
                if ("insert".equalsIgnoreCase(path)) {
                    LoggerUtils.loge("添加了新数据");
                } else if ("update".equalsIgnoreCase(path)) {
                    LoggerUtils.loge("更新了数据");
                } else if ("delete".equalsIgnoreCase(path)) {
                    LoggerUtils.loge("删除了数据");
                }

                UiUtils.runInMainThread(() -> {
                    LoggerUtils.loge("重新刷新界面");
                    loadPageData();
                });
            }
        }
    }
}

ALiCocoMusicPlayer客户端代码

public class MainActivity extends BaseSampleActivity {

    private ContentResolver mContentResolver;

    @Override
    public void initData() {
        mContentResolver = getContentResolver();
    }

    @OnClick({R.id.btn_add, R.id.btn_add_all,R.id.btn_query, R.id.btn_query_all})
    public void onViewClick(View view) {
        Uri uri = null;
        ContentValues contentValues = null;
        Cursor cursor = null;
        MusicTabinfo tabinfo = null;
        switch (view.getId()) {
            case R.id.btn_add:
                contentValues = new ContentValues();
                contentValues.put(MusicTabinfo.COLOUMN_NAME_MUSIC_NAME, "我的中国心");
                contentValues.put(MusicTabinfo.COLOUMN_NAME_AUTHOR, "张明明");
                contentValues.put(MusicTabinfo.COLOUMN_NAME_PUBLISH_NAME, "1989-12-11");
                contentValues.put(MusicTabinfo.COLOUMN_NAME_DESC, "爱国歌曲");
                // 拼接uri
                uri = Uri.parse(ALCooConst.KEY_RSCP_AU_PIREFIX + "insert");
                printUri(uri);
                // 插入数据
                mContentResolver.insert(uri, contentValues);
                break;
            case R.id.btn_add_all:
                String[] musicNames = {
                        "冰雨", "天涯", "谢谢你的爱", "我不够爱你", "你爱我像谁", "你是我的温柔", "17岁"
                };
                for (String musicName : musicNames) {
                    contentValues = new ContentValues();
                    contentValues.put(MusicTabinfo.COLOUMN_NAME_MUSIC_NAME, musicName);
                    contentValues.put(MusicTabinfo.COLOUMN_NAME_AUTHOR, "不详");
                    contentValues.put(MusicTabinfo.COLOUMN_NAME_PUBLISH_NAME, "1983-1-1");
                    contentValues.put(MusicTabinfo.COLOUMN_NAME_DESC, "不详");
                    // 拼接uri
                    uri = Uri.parse(ALCooConst.KEY_RSCP_AU_PIREFIX + "insert");
                    printUri(uri);
                    // 插入数据
                    mContentResolver.insert(uri, contentValues);
                }
                break;
            case R.id.btn_query:
                uri = Uri.parse(ALCooConst.KEY_RSCP_AU_PIREFIX + "select");
                printUri(uri);
                cursor = mContentResolver.query(uri, null, MusicTabinfo.COLOUMN_NAME_ID + " = ?", new String[]{3 + ""},"desc");
                if (cursor != null && cursor.moveToFirst()) {
                    int _id = cursor.getInt(cursor.getColumnIndex(MusicTabinfo.COLOUMN_NAME_ID));
                    String _name = cursor.getString(cursor.getColumnIndex(MusicTabinfo
                            .COLOUMN_NAME_MUSIC_NAME));
                    String _author = cursor.getString(cursor.getColumnIndex(MusicTabinfo
                            .COLOUMN_NAME_AUTHOR));
                    String _publish_time =
                            cursor.getString(cursor.getColumnIndex(MusicTabinfo
                                    .COLOUMN_NAME_PUBLISH_NAME));
                    String _desc = cursor.getString(cursor.getColumnIndex(MusicTabinfo
                            .COLOUMN_NAME_DESC));
                    tabinfo = new MusicTabinfo(_id, _name, _publish_time, _author, _desc);
                }

                LoggerUtils.loge("tabinfo = " + tabinfo);
                break;
            case R.id.btn_query_all:
                uri = Uri.parse(ALCooConst.KEY_RSCP_AU_PIREFIX + "select");
                printUri(uri);
                cursor = mContentResolver.query(uri, null, null, null, "desc");
                List<MusicTabinfo> list = new ArrayList<>();

                while (cursor != null && cursor.moveToNext()) {
                    int _id = cursor.getInt(cursor.getColumnIndex(MusicTabinfo.COLOUMN_NAME_ID));
                    String _name = cursor.getString(cursor.getColumnIndex(MusicTabinfo
                            .COLOUMN_NAME_MUSIC_NAME));
                    String _author = cursor.getString(cursor.getColumnIndex(MusicTabinfo
                            .COLOUMN_NAME_AUTHOR));
                    String _publish_time =
                            cursor.getString(cursor.getColumnIndex(MusicTabinfo
                                    .COLOUMN_NAME_PUBLISH_NAME));
                    String _desc = cursor.getString(cursor.getColumnIndex(MusicTabinfo
                            .COLOUMN_NAME_DESC));
                    tabinfo = new MusicTabinfo(_id, _name, _publish_time, _author, _desc);
                    list.add(tabinfo);
                }

                if (list.size() > 0) {
                    UiUtils.showToastSafe("查询到了 " + list.size() + " 条数据...");
                    for (MusicTabinfo musicTabinfo : list) {
                        LoggerUtils.loge(musicTabinfo.toString());
                    }
                }
                break;
        }
    }

    private void printUri(Uri uri) {
        LoggerUtils.loge(uri.toString());
    }
}

public class ALCooConst {
    // content://content provider authories/tablename
    public static final String KEY_RSCP_AU_PIREFIX = "content://com.cokuq.t_music/t_music/";
}
image
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,789评论 2 89
  • java事务的处理 转 https://www.cnblogs.com/Bonker/p/5417967.html...
    小小的Jobs阅读 1,301评论 0 1
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,612评论 4 59
  • 第一封情书睁开眼,闭上眼,都是你。 从今日起,为你写一万封情书,可好? 其实你也无需同意,毕竟你爱上的我过程,也未...
    破墨阅读 112评论 0 0
  • 连读 一、铺音+元音 二、元音+元音(转换音) a 、 i 、 e——y o 、u——w 三、铺音...
    爱做饭的猪猪阅读 242评论 0 1