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();
}
});
}
分享到:
相关推荐
最全sql查询语句练习题汇总(面试必备) 最全sql查询语句练习题汇总(面试必备) 最全sql查询语句练习题汇总(面试必备) 最全sql查询语句练习题汇总(面试必备) 最全sql查询语句练习题汇总(面试必备) 最全sql查询语句练习...
当我们谈论“经典的SQL查询语句,将内容作为字段查询”时,我们通常是指在SQL中使用内容作为查询的一部分来检索特定数据。这样的查询对于数据分析师、数据库管理员以及任何需要从大量数据中提取信息的人来说至关重要...
SQL子句是从一个特定的关键字始下一个特定的关键字(或末尾)的SQL查询语句子串,特键字包括“SELECT”、“FROM”、“WHERE”、“ORDER”、“GROUP”、“JOIN”、“HAVING”和“LIMIT”。我们可以将SQL查询语句中的...
在压缩包文件"sql_ok"中,可能包含了这样一个工具的安装程序或使用教程,可以帮助你开始探索和利用SQL语句生成器的便利性。 总之,SQL语句生成器是数据库开发者的得力助手,它能简化SQL编写,提高代码质量,降低...
- 视图是基于一个或多个表的虚拟表,它不存储数据,而是提供一个预定义的查询结果集。 - 创建视图的语句:`CREATE VIEW view_name AS SELECT column1, column2 FROM table;` 7. **索引(Index)** - 索引可以...
sql查询语句集合sql查询语句集合sql查询语句集合sql查询语句集合sql查询语句集合sql查询语句集合sql查询语句集合sql查询语句集合
超长SQL语句并没有一个明确的长度界限来定义,通常指的是那些结构复杂、包含大量字段或条件的SQL查询语句。这类语句往往难以阅读与维护,且可能存在性能问题。 ##### 常见场景 1. **数据导出/导入**:在进行大批量...
实验中,学生需要设计和实现五个 SQL 查询语句,分别是: 1.查询数据库中有哪些专业班级。 SQL 语句:SELECT 专业班级 FROM 学生表; 查询结果截图: 2.查询在 1986 年出生的学生的学号和出生日期。 SQL 语句:...
XML 查询语句转换成 SQL 语句的实现 本文主要讨论将 XML 查询语句转换成 SQL 语句的实现。XML 已经成为 Internet 上数据交换的事实标准,特别是在 Web 数据挖掘技术中,对数据源的结构化需求导致人们对 XML 文档的...
经典的常用SQL查询语句,比较实用,一些常用的组合语句一一收集
联合查询(`UNION`)允许将两个或多个`SELECT`语句的结果集合并为一个结果集。默认情况下,`UNION`会自动去除重复的行。例如,要合并两个查询的结果: ```sql SELECT column_name(s) FROM table1 UNION SELECT ...
动态拼接sql语句工具类,拼接where后面语句 配合原生jdbc仿动态sql注入 if (ObjectUtil.isNotEmpty(maxLat)&&ObjectUtil.isNotEmpty(minLat)){ sqlParamList.add(new SqlParam("lat",minLat, SqlOpEnum.GE)); ...
信息化时代学好一门技术很有必要,这是学sql语言的最基础查询语句,多多理解你一定会有所感悟的。
本话题将详细讲解一个简单的SQL循环语句脚本及其相关知识。 一、SQL循环语句概述 SQL循环语句主要包括WHILE循环和FOR循环,它们允许我们在满足特定条件时重复执行一段代码块。在PL/SQL和T-SQL中,还有BEGIN-END...
项目中已使用的一个比较简单的SQL语句查询字段解析工具类
SQL查询语句的性能优化与索引,写得还不错,可以看看了
结构化查询语言(Structured Query Language)简称SQL,结构化查询语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统; sql 语句就是对数据库进行操作的一种语言。 常见语句 ...
当需要将一个基于Oracle SQL的应用程序迁移到MySQL环境时,就需要进行SQL语句的转换工作。本项目提供了一个Java源码工具,能够帮助用户便捷地将Oracle SQL语句转换为MySQL SQL语句。 Oracle SQL与MySQL SQL的主要...