当前位置: 代码迷 >> SQL >> SQLiteQueryBuilder 是一个结构SQL查询语句的辅助类
  详细解决方案

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

热度:48   发布时间:2016-05-05 13:46:36.0
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,?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(); ?

} ?

?

}); ?

?

}?