(个人经验,仅供参考,错误之处,敬请谅解)
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);
}
}
313

被折叠的 条评论
为什么被折叠?



