当前位置: 首页 > news >正文

教做flash的网站wordpress 表白主题

教做flash的网站,wordpress 表白主题,烟台福山建设规划局网站,网站像素大小本节介绍Android的四大组件之一ContentProvider的基本概念和常见用法#xff1a;首先说明如何使用内容提供器封装内部数据的外部访问接口#xff0c;然后阐述如何使用内容解析器通过外部接口操作内部数据#xff0c;最后叙述如何利用内容解析器读写联系人信息#xff0c;以…        本节介绍Android的四大组件之一ContentProvider的基本概念和常见用法首先说明如何使用内容提供器封装内部数据的外部访问接口然后阐述如何使用内容解析器通过外部接口操作内部数据最后叙述如何利用内容解析器读写联系人信息以及如何利用内容观察器监听收到的短信内容。 6.5.1  通过ContentProvider封装数据 Android提供了四大组件分别是活动Activity、广播Broadcast、服务Service和内容提供器ContentProvider。其中内容提供器涵盖与内部数据存取有关的一系列组件完整的内容组件由内容提供器ContentProvider、内容解析器ContentResolver、内容观察器ContentObserver三部分组成。 ContentProvider给App存取内部数据提供了统一的外部接口让不同的应用之间得以互相共享数据。像上一章提到的SQLite可操作应用自身的内部数据库上传和下载功能可操作后端服务器的文件而ContentProvider可操作当前设备其他应用的内部数据它是一种中间层次的数据存储形式。 在实际编码中ContentProvider只是服务端App存储数据的抽象类开发者需要在其基础上实现一个完整的内容提供器并重写下列数据库管理方法。 ●  onCreate创建数据库并获得数据库连接。 ●  insert插入数据。 ●  delete删除数据。 ●  update更新数据。 ●  query查询数据并返回结果集的游标。 ●  getType获取内容提供器支持的数据类型。 这些方法看起来是不是很像SQLite没错ContentProvider作为中间接口本身并不直接保存数据而是通过SQLiteOpenHelper与SQLiteDatabase间接操作底层的数据库。所以要想使用ContentProvider首先得实现SQLite的数据库帮助器然后由ContentProvider封装对外的接口。以封装用户信息为例具体步骤主要分成以下3步。 1.  编写用户信息表的数据库帮助器 这个数据库帮助器就是常规的SQLite操作代码实现过程参见本章的“6.2.3  数据库帮助器SQLiteOpenHelper”完整代码如下 package com.example.roomdatabase.entity; //用户信息 public class UserInfo {public long rowid; // 行号public int xuhao; // 序号public String name; // 姓名public int age; // 年龄public long height; // 身高public float weight; // 体重public boolean married; // 婚否public String update_time; // 更新时间public String phone; // 手机号public String password; // 密码public UserInfo() {rowid 0L;xuhao 0;name ;age 0;height 0L;weight 0.0f;married false;update_time ;phone ;password ;} } package com.example.roomdatabase.database;import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log;import com.example.roomdatabase.entity.UserInfo;import java.util.ArrayList; import java.util.List;public class UserDBHelper extends SQLiteOpenHelper {private static final String TAG UserDBHelper;private static final String DB_NAME user.db; // 数据库的名称private static final int DB_VERSION 1; // 数据库的版本号private static UserDBHelper mHelper null; // 数据库帮助器的实例private SQLiteDatabase mDB null; // 数据库的实例public static final String TABLE_NAME user_info; // 表的名称private UserDBHelper(Context context) {super(context, DB_NAME, null, DB_VERSION);}private UserDBHelper(Context context, int version) {super(context, DB_NAME, null, version);}// 利用单例模式获取数据库帮助器的唯一实例public static UserDBHelper getInstance(Context context, int version) {if (version 0 mHelper null) {mHelper new UserDBHelper(context, version);} else if (mHelper null) {mHelper new UserDBHelper(context);}return mHelper;}// 打开数据库的读连接public SQLiteDatabase openReadLink() {if (mDB null || !mDB.isOpen()) {mDB mHelper.getReadableDatabase();}return mDB;}// 打开数据库的写连接public SQLiteDatabase openWriteLink() {if (mDB null || !mDB.isOpen()) {mDB mHelper.getWritableDatabase();}return mDB;}// 关闭数据库连接public void closeLink() {if (mDB ! null mDB.isOpen()) {mDB.close();mDB null;}}// 创建数据库执行建表语句Overridepublic void onCreate(SQLiteDatabase db) {Log.d(TAG, onCreate);String drop_sql DROP TABLE IF EXISTS TABLE_NAME ;;Log.d(TAG, drop_sql: drop_sql);db.execSQL(drop_sql);String create_sql CREATE TABLE IF NOT EXISTS TABLE_NAME ( _id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name VARCHAR NOT NULL, age INTEGER NOT NULL, height INTEGER NOT NULL, weight FLOAT NOT NULL, married INTEGER NOT NULL, update_time VARCHAR NOT NULL//演示数据库升级时要先把下面这行注释 ,phone VARCHAR ,password VARCHAR );;Log.d(TAG, create_sql: create_sql);db.execSQL(create_sql); // 执行完整的SQL语句}// 升级数据库执行表结构变更语句Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {Log.d(TAG, onUpgrade oldVersion oldVersion , newVersion newVersion);if (newVersion 1) {//Android的ALTER命令不支持一次添加多列只能分多次添加String alter_sql ALTER TABLE TABLE_NAME ADD COLUMN phone VARCHAR;;Log.d(TAG, alter_sql: alter_sql);db.execSQL(alter_sql);alter_sql ALTER TABLE TABLE_NAME ADD COLUMN password VARCHAR;;Log.d(TAG, alter_sql: alter_sql);db.execSQL(alter_sql); // 执行完整的SQL语句}}// 根据指定条件删除表记录public int delete(String condition) {// 执行删除记录动作该语句返回删除记录的数目return mDB.delete(TABLE_NAME, condition, null);}// 删除该表的所有记录public int deleteAll() {// 执行删除记录动作该语句返回删除记录的数目return mDB.delete(TABLE_NAME, 11, null);}// 往该表添加一条记录public long insert(UserInfo info) {ListUserInfo infoList new ArrayListUserInfo();infoList.add(info);return insert(infoList);}// 往该表添加多条记录public long insert(ListUserInfo infoList) {long result -1;for (int i 0; i infoList.size(); i) {UserInfo info infoList.get(i);ListUserInfo tempList new ArrayListUserInfo();// 如果存在同名记录则更新记录// 注意条件语句的等号后面要用单引号括起来if (info.name ! null info.name.length() 0) {String condition String.format(name%s, info.name);tempList query(condition);if (tempList.size() 0) {update(info, condition);result tempList.get(0).rowid;continue;}}// 如果存在同样的手机号码则更新记录if (info.phone ! null info.phone.length() 0) {String condition String.format(phone%s, info.phone);tempList query(condition);if (tempList.size() 0) {update(info, condition);result tempList.get(0).rowid;continue;}}// 不存在唯一性重复的记录则插入新记录ContentValues cv new ContentValues();cv.put(name, info.name);cv.put(age, info.age);cv.put(height, info.height);cv.put(weight, info.weight);cv.put(married, info.married);cv.put(update_time, info.update_time);cv.put(phone, info.phone);cv.put(password, info.password);// 执行插入记录动作该语句返回插入记录的行号result mDB.insert(TABLE_NAME, , cv);if (result -1) { // 添加成功则返回行号添加失败则返回-1return result;}}return result;}// 根据条件更新指定的表记录public int update(UserInfo info, String condition) {ContentValues cv new ContentValues();cv.put(name, info.name);cv.put(age, info.age);cv.put(height, info.height);cv.put(weight, info.weight);cv.put(married, info.married);cv.put(update_time, info.update_time);cv.put(phone, info.phone);cv.put(password, info.password);// 执行更新记录动作该语句返回更新的记录数量return mDB.update(TABLE_NAME, cv, condition, null);}public int update(UserInfo info) {// 执行更新记录动作该语句返回更新的记录数量return update(info, rowid info.rowid);}// 根据指定条件查询记录并返回结果数据列表public ListUserInfo query(String condition) {String sql String.format(select rowid,_id,name,age,height, weight,married,update_time,phone,password from %s where %s;, TABLE_NAME, condition);Log.d(TAG, query sql: sql);ListUserInfo infoList new ArrayListUserInfo();// 执行记录查询动作该语句返回结果集的游标Cursor cursor mDB.rawQuery(sql, null);// 循环取出游标指向的每条记录while (cursor.moveToNext()) {UserInfo info new UserInfo();info.rowid cursor.getLong(0); // 取出长整型数info.xuhao cursor.getInt(1); // 取出整型数info.name cursor.getString(2); // 取出字符串info.age cursor.getInt(3); // 取出整型数info.height cursor.getLong(4); // 取出长整型数info.weight cursor.getFloat(5); // 取出浮点数//SQLite没有布尔型用0表示false用1表示trueinfo.married (cursor.getInt(6) 0) ? false : true;info.update_time cursor.getString(7); // 取出字符串info.phone cursor.getString(8); // 取出字符串info.password cursor.getString(9); // 取出字符串infoList.add(info);}cursor.close(); // 查询完毕关闭数据库游标return infoList;}// 根据手机号码查询指定记录public UserInfo queryByPhone(String phone) {UserInfo info null;ListUserInfo infoList query(String.format(phone%s, phone));if (infoList.size() 0) { // 存在该号码的登录信息info infoList.get(0);}return info;} }2.  编写内容提供器的基础字段类        该类需要实现接口BaseColumns同时加入几个常量定义。详细代码示例如下 package com.example.roomdatabase.entity;import android.net.Uri; import android.provider.BaseColumns;import com.example.roomdatabase.database.UserDBHelper;public class UserInfoContent implements BaseColumns {// 这里的名称必须与AndroidManifest.xml里的android:authorities保持一致public static final String AUTHORITIES com.example;// 内容提供器的外部表名public static final String TABLE_NAME UserDBHelper.TABLE_NAME;// 访问内容提供器的URIpublic static final Uri CONTENT_URI Uri.parse(content:// AUTHORITIES /user);// 下面是该表的各个字段名称public static final String USER_NAME name;public static final String USER_AGE age;public static final String USER_HEIGHT height;public static final String USER_WEIGHT weight;public static final String USER_MARRIED married;// 默认的排序方法public static final String DEFAULT_SORT_ORDER _id desc; } 3.  通过右键菜单创建内容提供器 右击App模块的包名目录在弹出的右键菜单中依次选择New→Other→Content Provider,打开如图所示的组件创建对话框。 在创建对话框的Class Name一栏填写内容提供器的名称比如UserInfoProvider在URI Authorities一栏填写URI的授权串比如“com.example”注意这个授权串要跟 UserInfoContent里的一样然后单击对话框右下角的Finish按钮完成提供器的创建操作。 上述创建过程会自动修改App模块的两处地方一处是往AndroidManifest.xml添加内容提供器的注册配置配置信息示例如下 providerandroid:name.entity.UserInfoProviderandroid:authoritiescom.exampleandroid:enabledtrueandroid:exportedtrue /provider 另一处是在包名目录下生成名为UserInfoProvider.java的代码文件打开一看发现该类继承了ContentProvider并且提示重写onCreate、insert、delete、query、update、getType等方法以便对数据进行增删改查等操作。这个提供器代码显然只有一个框架还需补充详细的实现代码为此重写onCreate方法在此获取用户信息表的数据库帮助器实例其他insert、delete、query等方法也要加入对应的数据库操作代码修改之后的内容提供器代码如下 package com.example.roomdatabase.entity;import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri;import com.example.roomdatabase.database.UserDBHelper;public class UserInfoProvider extends ContentProvider {private final static String TAG UserInfoProvider;private UserDBHelper userDB; // 声明一个用户数据库的帮助器对象public static final int USER_INFO 1; // Uri匹配时的代号public static final UriMatcher uriMatcher new UriMatcher(UriMatcher.NO_MATCH);static { // 往Uri匹配器中添加指定的数据路径uriMatcher.addURI(UserInfoContent.AUTHORITIES, /user, USER_INFO);}public UserInfoProvider() {}// 根据指定条件删除数据Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {// Implement this to handle requests to delete one or more rows.int count 0;if (uriMatcher.match(uri) USER_INFO) { // 匹配到了用户信息表// 获取SQLite数据库的写连接SQLiteDatabase db userDB.getWritableDatabase();// 执行SQLite的删除操作并返回删除记录的数目count db.delete(UserInfoContent.TABLE_NAME, selection, selectionArgs);db.close(); // 关闭SQLite数据库连接}return count;}// 获取Uri支持的数据类型暂未实现Overridepublic String getType(Uri uri) {// TODO: Implement this to handle requests for the MIME type of the data// at the given URI.throw new UnsupportedOperationException(Not yet implemented);}// 插入数据Overridepublic Uri insert(Uri uri, ContentValues values) {// TODO: Implement this to handle requests to insert a new row.if (uriMatcher.match(uri) USER_INFO) { // 匹配到了用户信息表// 获取SQLite数据库的写连接SQLiteDatabase db userDB.getWritableDatabase();// 向指定的表插入数据返回记录的行号long rowId db.insert(UserInfoContent.TABLE_NAME, null, values);if (rowId 0) { // 判断插入是否执行成功// 如果添加成功就利用新记录的行号生成新的地址Uri newUri ContentUris.withAppendedId(UserInfoContent.CONTENT_URI, rowId);// 通知监听器数据已经改变getContext().getContentResolver().notifyChange(newUri, null);}db.close(); // 关闭SQLite数据库连接}return uri;}// 创建ContentProvider时调用可在此获取具体的数据库帮助器实例Overridepublic boolean onCreate() {// TODO: Implement this to initialize your content provider on startup.userDB UserDBHelper.getInstance(getContext(), 1);return true;}// 根据指定条件查询数据库Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {Cursor cursor null;if (uriMatcher.match(uri) USER_INFO) { // 匹配到了用户信息表// 获取SQLite数据库的读连接SQLiteDatabase db userDB.getReadableDatabase();// 执行SQLite的查询操作cursor db.query(UserInfoContent.TABLE_NAME,projection, selection, selectionArgs, null, null, sortOrder);// 设置内容解析器的监听cursor.setNotificationUri(getContext().getContentResolver(), uri);}return cursor; // 返回查询结果集的游标}// 更新数据暂未实现Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {// TODO: Implement this to handle requests to update one or more rows.throw new UnsupportedOperationException(Not yet implemented);} }
http://www.hkea.cn/news/14561396/

相关文章:

  • 无锡公司建立网站苏州展厅设计公司排名
  • 3000元网站建设三年南宁建设职业技术学院招聘信息网站
  • 苏州知名高端网站建设公司网站推广哪种方法最
  • 网站前端怎么做方法做网站比较好的公司有哪些
  • 刷链接浏览量网站友链提交入口
  • 黑龙江省建设厅网站东莞阳光网论坛
  • 哈尔滨多语言网站建设涪陵区小城镇建设管理处网站
  • 和印度做外贸的网站网页制作团队
  • 做闪图的网站五大建设是指什么
  • 多城市分站站群cms广西建设官方网站
  • 建设校园网站必要性国内专门做酒的网站有哪些
  • 影响网站pr的因素有哪些有没有专门做特产的网站
  • 佛山教育平台网站建设简述网站建设在作用
  • 北京上海网站建设公司朋友圈网络营销
  • 二 网站建设的重要性网站开发技术发展史
  • 自己做的网页怎么连接到网站阿里云备案网站备案域名
  • 做用户运营应该关注哪些网站qq群推广拉人
  • 福州网站建设 找燕狂徒 05笨鸟网站开发
  • 网站改版对seo南昌做seo的公司
  • 沈阳做网站推广的公司广州建设总承包集团
  • 小公司做网站用哪种服务器网站淘客宝怎么做
  • 北京专业网站设计公司北京网站托管维护
  • 国内用什么做网站wordpress 笑话站
  • 建设银行 贷款 查询 网站校内网站建设与维护
  • 鞍山58路公交车路线南昌seo招聘信息
  • 旅游手机网站开发wordpress 汉化工具
  • 1元涨1000粉丝网站网站建设与管理试题与答案
  • 青岛网站建设华夏亚马逊雨林到底有多恐怖
  • 营销网站建设情况调查问卷河北网站建设推广
  • 重庆网站建站建设的费用综合型网站建设