SQLiteQueryBuilder 是一个构造SQL查询语句的辅助类

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, nullnullnull);  

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();  

}  

 

});  

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值