懒癌时隔多年终于来更新第二篇了。。。该篇主要讲之前vp+rc实现的calendar的日期数据的保存,之前讲了VIewPager的Calendar的实现方式,针对日期相关的数据一直都是即时生成的方式,遗留下来了日期相关属性无法保存,每次都是新数据的问题。接下来讲讲如何结合实际需求使用ContentProvider保存date日期
开篇
存什么表?
首先想到的有三种表存储方式,一个是按照每月的数据存一个表、二是按照ViewPager每页的数据存一个表、三简单粗暴整个一个表。考虑到每页的数据都掺差有上月和下月的日期,如果按月存表每一页都要访问三个数据库按月方式就作罢了,再一个对比按页存表和一整个表对比,按页存表就得存多个表,访问的时候肯定需要先前判断哪个表,又考虑到ViewPager的页数动态及各类型的判断,所以决定采用第三种方式。一整个表,访问简单也便于管理
需要存什么?
既然是日历,那肯定是存日期了。再次明确与日期相关的属性什么必要存什么不必要存,目前date object内有如下的数据:
public int _id = -1;//数据库中存的id
public int year;
public int month;
public int day;
public String YYMMDD;//年月日字符串
public String YYMM;//年月
public int position;//在grid中的位置
public int pagerIndex;//在viewpager中的页数位置
public boolean currentMonth = false;//当月标志
public boolean sellectStatus = false;//选中标志
年月日是肯定要存的,两个中文串可用可不用看需求存不存,因为查询的时候设置数据需要日期在当前页的位置数据所以把该日期所在的页数和在该页数所在的position也一并存了。剩下的currentMonth和sellectStatus,当月的bool值可与实际月份判断故不存,选中标志便于在恢复数据的时候能够正确记录之前的数据操作就存上了
正文
数据存储
使用ContentProvider存储日期数据
ContentProvider配置
第一步:新建一个基类 BaseProvider 继承自 ContentProvider,静态代码块定义uri和存储数据
static {
mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//和CONTENT_URI保持一致
mUriMatcher.addURI(Provider.AUTHORITY, "dates", DATES_DIR);
mUriMatcher.addURI(Provider.AUTHORITY, "dates/#", DATES_ID);
//定义存入库的数据
mDatesProjectionMap = new HashMap<>();
mDatesProjectionMap.put(Provider.DatesColumns._ID,Provider.DatesColumns._ID);
mDatesProjectionMap.put(Provider.DatesColumns.POSITION,Provider.DatesColumns.POSITION);
mDatesProjectionMap.put(Provider.DatesColumns.PAGER_INDEX,Provider.DatesColumns.PAGER_INDEX);
mDatesProjectionMap.put(Provider.DatesColumns.YEAR,Provider.DatesColumns.YEAR);
mDatesProjectionMap.put(Provider.DatesColumns.MONTH,Provider.DatesColumns.MONTH);
mDatesProjectionMap.put(Provider.DatesColumns.DAY,Provider.DatesColumns.DAY);
mDatesProjectionMap.put(Provider.DatesColumns.CURRENT_MONTH,Provider.DatesColumns.CURRENT_MONTH);
mDatesProjectionMap.put(Provider.DatesColumns.SELLECT_STATUS,Provider.DatesColumns.SELLECT_STATUS);
mDatesProjectionMap.put(Provider.DatesColumns.YYMMDD,Provider.DatesColumns.YYMMDD);
mDatesProjectionMap.put(Provider.DatesColumns.YYMM,Provider.DatesColumns.YYMM);
}
重写增删改查四个方法
//查
@Nullable
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(Provider.DatesColumns.TABLE_NAME);
switch (mUriMatcher.match(uri)) {
case DATES_DIR:
qb.setProjectionMap(mDatesProjectionMap);
break;
case DATES_ID:
qb.setProjectionMap(mDatesProjectionMap);
qb.appendWhere(Provider.DatesColumns._ID + "=" + uri.getPathSegments().get(1));
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
// If no sort order is specified use the default
String orderBy;
if (TextUtils.isEmpty(sortOrder)) {
orderBy = Provider.DatesColumns.DEFAULT_SORT_ORDER;
} else {
orderBy = sortOrder;
}
// Get the database and run the query
SQLiteDatabase db = mDatabaseHelper.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;
}
//增
@Nullable
@Override
public Uri insert(Uri uri, ContentValues contentValues) {
if (mUriMatcher.match(uri) != DATES_DIR){
throw new IllegalArgumentException("Unknown URI"+uri);
}
ContentValues values;
if (contentValues != null