8.5.3? 使用ContentProvider操作数据日记本实例(4)
代码解释:
首先得到SQLiteDatabase 的实例,然后得到rowId,最后再调用db.update(DIARY_ TABLE_NAME, values, DiaryColumns._ID + "="+ rowId, null)语句执行更新工作。
(4)查寻一条数据的方法:query()。
具体实现代码如下所示:
@Override?
public?Cursor?query(Uri?uri,?String[]?projection,?String?selection, ?
String[]?selectionArgs,?String?sortOrder)?{ ?
SQLiteQueryBuilder?qb?=?new?SQLiteQueryBuilder(); ?
?
switch?(sUriMatcher.match(uri))?{ ?
case?DIARIES: ?
qb.setTables(DIARY_TABLE_NAME); ?
break; ?
?
case?DIARY_ID: ?
qb.setTables(DIARY_TABLE_NAME); ?
qb.appendWhere(DiaryColumns._ID?+?"="?
+?uri.getPathSegments().get(1)); ?
break; ?
?
default: ?
throw?new?IllegalArgumentException("Unknown?URI?"?+?uri); ?
} ?
?
String?orderBy; ?
if?(TextUtils.isEmpty(sortOrder))?{ ?
orderBy?=?Diary.DiaryColumns.DEFAULT_SORT_ORDER; ?
}?else?{ ?
orderBy?=?sortOrder; ?
} ?
?
SQLiteDatabase?db?=?mOpenHelper.getReadableDatabase(); ?
Cursor?c?=?qb.query(db,?projection,?selection,?selectionArgs,?null, ?
null,?orderBy); ?
return?c; ?
}?
代码解释:
SQLiteQueryBuilder 是一个构造SQL查询语句的辅助类。
sUriMatcher.match(uri),根据返回值可以判断这次查询请求时,它是请求全部数据还是某个id的数据。
如果返回值是DIARIES,那么只需要执行qb.setTables(DIARY_TABLE_NAME)语句就可以了。
如果返回值是DIARY_ID,那么还需要将where部分的参数设置进去,代码为qb.appendWhere(DiaryColumns._ID + "="+ uri.getPathSegments().get(1))。
SQLiteDatabase db = mOpenHelper.getReadableDatabase(),得到一个可读的SQLiteDatabase 实例。
Cursor c = qb.query(db, projection, selection, selectionArgs, null,null, orderBy)语句,这个查询类似于一个标准的SQL查询,但是这个查询是SQLiteQueryBuilder 来发起的,而不是SQLiteDatabase 直接发起的,所以在参数方面略有不同。这个函数为 query(SQLiteDatabase db, String[] projectionIn, String selection, String[] selectionArgs, String groupBy, String having, String sortOrder, String limit)下边将各个参数介绍一下。
第一个参数为要查询的数据库实例。
第二个参数是一个字符串数组,里边的每一项代表了需要返回的列名。
第三个参数相当于SQL语句中的where部分。
第四个参数是一个字符串数组,里边的每一项依次替代在第三个参数中出现的问号(?)。
第五个参数相当于SQL语句当中的groupby部分。
第六个参数相当于SQL语句当中的having部分。
第七个参数描述是怎么进行排序。
第八个参数相当于SQL当中的limit部分,控制返回的数据的个数。
在DiaryContentProvider类里边还有两个方法,一个是getType(Uri uri),另一个是getFormateCreatedDate()。后者根据时间得到一个我们特定格式的字符串,比较简单。而前者是必须要重写的方法。下边看一下我们如何重写了getType方法,具体代码如下所示:
public?String?getType(Uri?uri)?{ ?
switch?(sUriMatcher.match(uri))?{ ?
case?DIARIES: ?
return?DiaryColumns.CONTENT_TYPE; ?
?
case?DIARY_ID: ?
return?DiaryColumns.CONTENT_ITEM_TYPE; ?
?
default: ?
throw?new?IllegalArgumentException("Unknown?URI?"?+?uri); ?
} ?
}?
代码解释:
此方法返回一个所给Uri的指定数据的MIME类型。它的返回值如果以vnd.Android. cursor.item开头,那么就代表这个Uri指定的是单条数据。如果是以vnd.Android.cursor.dir开头的话,那么说明这个Uri指定的是全部数据。
7.第七步
在程序主界面单击MENU键,程序运行界面如图8-33所示。
在ActivityMain中执行的代码如下所示:
@Override?
public?boolean?onCreateOptionsMenu(Menu?menu)?{ ?
super.onCreateOptionsMenu(menu); ?
menu.add(0,?MENU_ITEM_INSERT,?0,?R.string.menu_insert); ?
return?true; ?
}?
代码解释:
我们给菜单(menu)添加了一项,如图8-33所示。
单击添加日记按钮后进入如图8-34所示界面。
?
(点击查看大图)图8-33? 单击MENU键
?
(点击查看大图)图8-34? 新建日记的页面
图8-34所示的这个页面的布局和第8章前一个日记本程序里的布局完全一样,关于布局,读者可以参看第8章日记本程序例子的讲解。
下面来看一下在ActivityDiaryEditor中,是怎么处理两种不同情况进入日记本程序界面的。一种是通过新建日记进入此界面,另一种是经过编辑日记进入此日记运行界面。下面是在ActivityDiaryEditor程序中使用的onCreate()函数,其代码如下所示:
@Override?
protected?void?onCreate(Bundle?savedInstanceState)?{ ?
super.onCreate(savedInstanceState); ?
setTheme(Android.R.style.Theme_Black); ?
final?Intent?intent?=?getIntent(); ?
final?String?action?=?intent.getAction(); ?
setContentView(R.layout.diary_edit); ?
mTitleText?=?(EditText)?findViewById(R.id.title); ?
mBodyText?=?(EditText)?findViewById(R.id.body); ?
confirmButton?=?(Button)?findViewById(R.id.confirm); ?
?
if?(EDIT_DIARY_ACTION.equals(action))?{//?编辑日记 ?
mState?=?STATE_EDIT; ?
mUri?=?intent.getData(); ?
mCursor?=?managedQuery(mUri,?PROJECTION,?null,?null,?null); ?
mCursor.moveToFirst(); ?
String?title?=?mCursor.getString(1); ?
mTitleText.setTextKeepState(title); ?
String?body?=?mCursor.getString(2); ?
mBodyText.setTextKeepState(body); ?
setResult(RESULT_OK,?(new?Intent()).setAction(mUri.toString())); ?
setTitle("编辑日记"); ?
}?else?if?(INSERT_DIARY_ACTION.equals(action))?{//?新建日记 ?
mState?=?STATE_INSERT; ?
setTitle("新建日记"); ?
}?else?{ ?
Log.e(TAG,?"no?such?action?error"); ?
finish(); ?
return; ?
} ?
?
confirmButton.setOnClickListener(new?View.OnClickListener()?{ ?
public?void?onClick(View?view)?{ ?
if?(mState?==?STATE_INSERT)?{ ?
insertDiary(); ?
}?else?{ ?
updateDiary(); ?
} ?
Intent?mIntent?=?new?Intent(); ?
setResult(RESULT_OK,?mIntent); ?
finish(); ?
} ?
?
}); ?
?
}?
详细解决方案
SQLiteQueryBuilder 是一个结构SQL查询语句的辅助类
热度:48 发布时间:2016-05-05 13:46:36.0