Android 使用ContentProvider、CursorLoader结合一种Adapter

(个人经验,仅供参考,错误之处,敬请谅解)

ContentProvider

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
示例:

public class MyProvider extends ContentProvider {
    private ContentResolver resolver;
    private DBHelper dbHelper;
    private SQLiteDatabase db;
    private static UriMatcher matcher;
    //所有的Uri匹配
    static {
        matcher = new UriMatcher(UriMatcher.NO_MATCH);
        matcher.addURI("cn.cslg.traffic.dao.MyProvider","user",1);   //解析uri,产生对应的code
        matcher.addURI("cn.cslg.traffic.dao.MyProvider","city",2);
        matcher.addURI("cn.cslg.traffic.dao.MyProvider","history",3);
    }
    @Override
    public boolean onCreate() {
        dbHelper = new DBHelper(getContext(),"traffic.db",null,1);
        db = dbHelper.getReadableDatabase();
        resolver = getContext().getContentResolver();
        return true;
    }

    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
        int code=matcher.match(uri);
        Cursor cursor = null;
        switch (code){
            case 1:cursor = db.query("user",projection,selection,selectionArgs,null,null,sortOrder);break;
            case 2:cursor = db.query("city",projection,selection,selectionArgs,null,null,sortOrder);break;
            case 3:cursor = db.query("history",projection,selection,selectionArgs,null,null,sortOrder);break;
            default:System.out.println("It's an unknown uri");break;
        }
        cursor.setNotificationUri(resolver,uri);
        return cursor;
    }

    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        return null;
    }

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
        int code=matcher.match(uri);
        switch (code){
            case 1:db.insert("user",null,values);break;
            case 2:db.insert("city",null,values);break;
            case 3:db.insert("history",null,values);break;
            default:System.out.println("It's an unknown uri");break;
        }
        resolver.notifyChange(uri,null);
        return uri;
    }

    @Override
    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
        int code=matcher.match(uri);
        int rowsDeleted = 0;
        switch (code){
            case 1:rowsDeleted = db.delete("user",selection,selectionArgs);break;
            case 2:rowsDeleted = db.delete("city",selection,selectionArgs);break;
            case 3:rowsDeleted = db.delete("history",selection,selectionArgs);break;
            default:System.out.println("It's an unknown uri");break;
        }
        if(rowsDeleted!=0)
            resolver.notifyChange(uri,null);
        return rowsDeleted;
    }

    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
        int code=matcher.match(uri);
        int rowsUpdated = 0;
        switch (code){
            case 1:rowsUpdated = db.update("user",values,selection,selectionArgs);break;
            case 2:rowsUpdated = db.update("city",values,selection,selectionArgs);break;
            case 3:rowsUpdated = db.update("history",values,selection,selectionArgs);break;
            default:System.out.println("It's an unknown uri");break;
        }
        if(rowsUpdated != 0)
            resolver.notifyChange(uri,null);
        return rowsUpdated;
    }
}

CursorLoader

    主要的功能在于异步加载数据,泛型可以是Cursor,可以是其他类型,这里讲的是数据库操作Cursor。
    1、实现LoaderManager.LoaderCallbacks< Cursor >接口
    2、使用initLoader(id,args,callbacks)函数进行初始化

CursorAdapter示例

public class ChooseCityActivity extends Activity implements LoaderManager.LoaderCallbacks<Cursor> {
	......
	private void init(){
        resolver = getContentResolver();
        SharedPreferences sharedPreferences = getSharedPreferences("initCity",MODE_PRIVATE);
        boolean isFirst = sharedPreferences.getBoolean("isFirst",true);
        if(isFirst){
            CityTask cityTask = new CityTask();
            cityTask.execute();
        }
        adapter = new CursorAdapter(this,null,0) {
            @Override
            public View newView(Context context, Cursor cursor, ViewGroup parent) {
                View view = getLayoutInflater().inflate(R.layout.city_list_item,null);
                ViewHolder holder = new ViewHolder();
                holder.name = view.findViewById(R.id.city_item);
                view.setTag(holder);
                return view;
            }

            @Override
            public void bindView(View view, Context context, Cursor cursor) {
                ViewHolder holder = (ViewHolder)view.getTag();
                String name = cursor.getString(cursor.getColumnIndex("name"));
                holder.name.setText(name);
            }
			//复用布局
            final class ViewHolder{
                TextView name;
            }
        };
        cityList.setAdapter(adapter);
        getLoaderManager().initLoader(0,null,this);
    }
    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        String[] projection = {"_id","name"};
        Uri uri = Uri.parse("content://cn.cslg.traffic.dao.MyProvider/city");
        String constraint = cityList.getText().toString();
        String selection = "name like '" + constraint +"%'";
        CursorLoader cursorLoader = new CursorLoader(this,uri,projection,selection,null,null);
        return cursorLoader;
    }
	//Cursor加载完成,获取数据进行处理
    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        adapter.swapCursor(data);
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        adapter.swapCursor(null);
    }
}

SimpleCursorAdapter示例

public class History extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> {
	......
    @NonNull
    @Override
    public Loader<Cursor> onCreateLoader(int id, @Nullable Bundle args) {
        Uri uri = Uri.parse("content://cn.cslg.traffic.dao.MyProvider/history");
        String selection = "user_id = "+userId;
        return new CursorLoader(getContext(),uri,null,selection,null,null);
    }
	//因为SimpleCursorAdapter需要Cursor进行实例化,所以在加载完成中进行
    @Override
    public void onLoadFinished(@NonNull Loader<Cursor> loader, Cursor data) {
        adapter = new SimpleCursorAdapter(getContext(),R.layout.history_list_item,data,
                new String[]{"type","city","station","route","start_station","end_station"},
                new int[]{R.id.history_item_type,R.id.history_item_city,R.id.history_item_station,R.id.history_item_route,
                R.id.history_item_start,R.id.history_item_end},
                CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
        adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
            @Override
            public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
                switch(cursor.getInt(columnIndex)){
                    case 1:((TextView)view).setText("站点 ");return true;
                    case 2:((TextView)view).setText("路线 ");return true;
                    case 3:((TextView)view).setText("换乘 ");return true;
                }
                if(cursor.getInt(cursor.getColumnIndex("type"))==3&&cursor.getColumnName(columnIndex).equals("start_station")) {
                    ((TextView) view).setText(cursor.getString(columnIndex) + ">>");
                    return true;
                }
                return false;
            }
        });
        historyList.setAdapter(adapter);
    }

    @Override
    public void onLoaderReset(@NonNull Loader<Cursor> loader) {
        adapter.swapCursor(null);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值