赵雅智_android通过内容提供者实现电话薄显示更新删除案例
来源:互联网 发布:淘宝网服装男士 编辑:程序博客网 时间:2024/06/03 21:59
需求分析:
通过ContentResolver操作内容提供者的数据,将姓名,电话显示在listView中,并带有添加和删除按钮进行相应操作
实现思路步骤:
- Adater模型层
- 创建内容解析器对象 ContentResolver
- 定义URI
- 自定义CursorAdapter
- 实现构造器public MyCursorAapter(Context context, Cursor c, int flags)
- 实现public View newView(Context context, Cursor cursor, ViewGroup parent)方法
- 实现public void bindView(View view, Context context, Cursor cursor)
- 给adapter设置显示数据
- 查找控件
- 给控件设置值
- 删除数据
- contentResolver的delete方法删除数据
- 重新初始化数据
- contentResolver的delete方法删除数据
- 更新数据
- 新建activity和布局文件
- 在MainActivity中通过intent跳转activity并将点击对应位置的值传到更新界面
- 获取相对应的数据
- 通过intent跳转activity
- 用startActivityForResult发送带有数据的返回值
- 查找控件并赋值
- 查找控件
- 将intent传过来的值赋给控件
- 创建内容解析器
- 通过内容解析器更新数据
- uri声明
- 通过ContentValues放值
- 将结果码和更新结果值传回MainActivity
- 在MainActivity中重写onActivityResult方法处理更新成功或者失败
- 给adapter设置显示数据
- 用内容解析器初始化数据并设置adapter
- contentResolver的query方法查找数据
- 在视图中绑定
- contentResolver的query方法查找数据
实现效果
主界面
删除bbb
点击更新后打开的界面
更新数据
更新后界面
主要代码
contentprovider共享的数据和ContentProvider介绍一样
http://blog.csdn.net/zhaoyazhi2129/article/details/29839561
布局文件
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbarStyle="outsideInset" > </ListView></RelativeLayout>
list_item_user.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/btn_delete" android:layout_width="30dp" android:layout_height="30dp" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:layout_marginTop="5dp" android:layout_marginLeft="5dp" android:layout_marginRight="10dp" android:background="@drawable/del" android:onClick="delete" /> <Button android:id="@+id/btn_update" android:layout_width="30dp" android:layout_height="30dp" android:layout_alignParentTop="true" android:layout_toLeftOf="@+id/btn_delete" android:onClick="update" android:layout_margin="5dp" android:background="@drawable/refresh" /> <TextView android:id="@+id/tv_name" android:layout_width="60dp" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/btn_update" android:layout_alignBottom="@+id/btn_update" android:layout_alignParentLeft="true" android:paddingLeft="10dp" android:text="TextView" /> <TextView android:id="@+id/tv_phone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/tv_name" android:layout_toRightOf="@+id/tv_name" android:paddingLeft="10dp" android:text="TextView" /></RelativeLayout>
activity_user_update.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="10dp" android:orientation="vertical" tools:context=".UserUpdateActivity" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/tv_upd_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="用户编号" /> <EditText android:id="@+id/ed_upd_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:ems="10" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/tv_upd_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="用户名称" /> <EditText android:id="@+id/ed_upd_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:ems="10" > <requestFocus /> </EditText> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/tv_upd_age" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="用户年龄" /> <EditText android:id="@+id/ed_upd_age" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:ems="10" android:inputType="number" > <requestFocus /> </EditText> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/tv_upd_phone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="用户电话" /> <EditText android:id="@+id/ed_upd_phone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:ems="10" android:inputType="phone" > <requestFocus /> </EditText> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/tv_upd_salary" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="用户薪水" /> <EditText android:id="@+id/ed_upd_salary" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:ems="10" android:inputType="numberDecimal" > <requestFocus /> </EditText> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:layout_marginTop="20dp" android:orientation="horizontal" > <Button android:id="@+id/button1" android:layout_width="140dp" android:layout_height="wrap_content" android:background="@drawable/btn_bg" android:onClick="update" android:text="更新用户" android:gravity="center" /> </LinearLayout> </LinearLayout>
主程序MainActivity.java
package com.example.android_provider;import android.app.Activity;import android.content.ContentResolver;import android.content.Context;import android.content.Intent;import android.content.pm.LabeledIntent;import android.database.Cursor;import android.net.Uri;import android.os.Bundle;import android.support.v4.widget.CursorAdapter;import android.support.v4.widget.SimpleCursorAdapter;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.Button;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity {private ListView lv_user;// 内容解析器private ContentResolver contentResolver;// 操作的标志private static final String AUTHORITIE = "www.csdn.com.provider.userContentProvider";// 请求码int requestUpdCode = 1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 模型层// 创建内容解析器对象contentResolver = getContentResolver();lv_user = (ListView) findViewById(R.id.listView1);initData();}/** * 查找数据 */private void initData() {// 控制层(自定义)Cursor c = contentResolver.query(Uri.parse("content://" + AUTHORITIE + "/query"), new String[] {"userid as _id", "username", "userage", "usersalary","userphone" }, null, null, null);MyCursorAapter adapter = new MyCursorAapter(this, c,CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);// 视图层lv_user.setAdapter(adapter);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);// 请求码if (requestCode == requestUpdCode) {// 结果码if (resultCode == 2) {// 传过来的数据if (data.getIntExtra("count", 0) > 0) {initData();// 重新加载界面Toast.makeText(this, "更新成功", 0).show();} else {Toast.makeText(this, "更新失败", 0).show();}}}}class MyCursorAapter extends CursorAdapter {// 上下文对象private Context context;// 打气筒,布局服务对象private LayoutInflater mInflater;// 构造器public MyCursorAapter(Context context, Cursor c, int flags) {super(context, c, flags);this.context = context;mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);}// mInflater服务通过inflate方法返回一个View控件对象// 通过自己的布局文件转化的View对象,转化之后就可以在bindView处理// 先new出当前的布局。new出每一个条目的布局文件。// new出当前布局,bindView中就可以用findViewById去拿控件@Overridepublic View newView(Context context, Cursor cursor, ViewGroup parent) {return mInflater.inflate(R.layout.list_item_user, parent, false);}@Overridepublic void bindView(View view, Context context, Cursor cursor) {// 查找组件Button btn_del = (Button) view.findViewById(R.id.btn_delete);Button btn_upd = (Button) view.findViewById(R.id.btn_update);TextView tv_name = (TextView) view.findViewById(R.id.tv_name);TextView tv_phone = (TextView) view.findViewById(R.id.tv_phone);// 设置值tv_name.setText(cursor.getString(cursor.getColumnIndex("username")));tv_phone.setText(cursor.getString(cursor.getColumnIndex("userphone")));// 根据id删除final int _id = cursor.getInt(cursor.getColumnIndex("_id"));final String name = cursor.getString(cursor.getColumnIndex("username"));// 删除按钮的注册事件btn_del.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 通过内容解析器删除int count = contentResolver.delete(Uri.parse("content://" + AUTHORITIE + "/delete"),"userid=?", new String[] { _id + "" });if (count > 0) {Toast.makeText(MainActivity.this, "成功删除掉" + name,Toast.LENGTH_LONG).show();// 删除后重新加载initData();}}});// 根据每条更新final String age = cursor.getString(cursor.getColumnIndex("userage"));final String salary = cursor.getString(cursor.getColumnIndex("usersalary"));final String phone = cursor.getString(cursor.getColumnIndex("userphone"));// 更新按钮的注册事件btn_upd.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent();intent.putExtra("uid", _id);intent.putExtra("uname", name);intent.putExtra("uage", age);intent.putExtra("usalary", salary);intent.putExtra("uphone", phone);intent.setClass(getApplicationContext(),UserUpdateActivity.class);startActivityForResult(intent, requestUpdCode);}});}}}
更新UserUpdateActivity.java
package com.example.android_provider;import android.app.Activity;import android.content.ContentResolver;import android.content.ContentValues;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.view.View;import android.widget.EditText;public class UserUpdateActivity extends Activity {// 内容解析器private ContentResolver contentResolver;// 操作的标志private static final String AUTHORITIE = "www.csdn.com.provider.userContentProvider";private EditText etName, etAge, etSalary, etId, etPhone;// 结果码private int resultCode = 2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_user_update);findView();// 获取意图对象Intent intent = getIntent();// 给控件设置intent传过来的值 是数字都必须加“”转为字符串etId.setText(intent.getIntExtra("uid", 0) + "");etName.setText(intent.getStringExtra("uname"));etAge.setText(intent.getIntExtra("uage", 18) + "");etSalary.setText(intent.getDoubleExtra("usalary", 0) + "");etPhone.setText(intent.getStringExtra("uphone"));// 创建解析器对象contentResolver = getContentResolver();}// 查找控件public void findView() {etId = (EditText) findViewById(R.id.ed_upd_id);etName = (EditText) findViewById(R.id.ed_upd_name);etAge = (EditText) findViewById(R.id.ed_upd_age);etSalary = (EditText) findViewById(R.id.ed_upd_salary);etPhone = (EditText) findViewById(R.id.ed_upd_phone);}public void update(View v) {String uid = etId.getText().toString().trim();String uname = etName.getText().toString().trim();String uage = etAge.getText().toString().trim();String usalart = etSalary.getText().toString().trim();String uphone = etPhone.getText().toString().trim();// values.put(key, value)put的key值必须是数据库里的值ContentValues values = new ContentValues();values.put("userid", uid);values.put("username", uname);values.put("userage", uage);values.put("usersalary", usalart);values.put("userphone", uphone);int count = contentResolver.update(Uri.parse("content://" + AUTHORITIE + "/update"), values,"userid=?", new String[] { uid });Intent intent = new Intent();intent.putExtra("count", count);UserUpdateActivity.this.setResult(resultCode, intent);// 关闭资源this.finish();}}
配置文件AndroidManifest.java
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android_provider" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.android_provider.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.example.android_provider.UserUpdateActivity" android:theme="@android:style/Theme.Dialog" > </activity> </application></manifest>
知识点解析
知识点1:LayoutInflater mInflater
<span style="white-space:pre"></span>// 构造器<span style="white-space:pre"></span>public MyCursorAapter(Context context, Cursor c, int flags) {<span style="white-space:pre"></span>super(context, c, flags);<span style="white-space:pre"></span>this.context = context;<span style="white-space:pre"></span>mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);<span style="white-space:pre"></span>}
mInflater充当打气筒的角色,布局服务对象
mInflater服务通过inflate方法返回一个View控件对象
通过自己的布局文件转化的View对象,转化之后就可以在bindView处理
先new出当前的布局,new出每一个条目的布局文件。
知识点2:newView
@Overridepublic View newView(Context context, Cursor cursor, ViewGroup parent) {return mInflater.inflate(R.layout.list_item_user, parent, false);}
new出当前布局,bindView中就可以用findViewById去拿控件
知识点3:cursor
//设置值tv_name.setText(cursor.getString(cursor.getColumnIndex("username")));tv_phone.setText(cursor.getString(cursor.getColumnIndex("userphone")));
cursor.getColumnIndex():cursor对于的列
cursor.getString():cursor对应列的值
知识点4:startActivityForResult
当你关闭activity时有返回值的情况下用startActivityForResult方法,并通过重新onActivityResult方法处理
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);// 请求码if (requestCode == requestUpdCode) {// 结果码if (resultCode == 2) {// 传过来的数据if (data.getIntExtra("count", 0) > 0) {initData();// 重新加载界面Toast.makeText(this, "更新成功", 0).show();} else {Toast.makeText(this, "更新失败", 0).show();}}}}
知识点5:intent.getIntExtra(name, defaultValue)
给控件设置intent传过来的值 是数字都必须加“”转为字符串
<span style="white-space:pre"></span>// 获取意图对象Intent intent = getIntent();// 给控件设置intent传过来的值 是数字都必须加“”转为字符串etId.setText(intent.getIntExtra("uid", 0) + "");etName.setText(intent.getStringExtra("uname"));etAge.setText(intent.getIntExtra("uage", 18) + "");etSalary.setText(intent.getDoubleExtra("usalary", 0) + "");etPhone.setText(intent.getStringExtra("uphone"));
知识点6:values.put(key, value)
ContentValues values = new ContentValues();values.put("userid", uid);values.put("username", uname);values.put("userage", uage);values.put("usersalary", usalart);values.put("userphone", uphone);
put的key值必须是数据库里的值
转载请标明转载地址:http://blog.csdn.net/zhaoyazhi2129/article/details/29875555
0 0
- 赵雅智_android通过内容提供者实现电话薄显示更新删除案例
- 内容提供者,更新数据库
- 读取电话薄内容在TableView中显示
- 赵雅智_Android案例_刮刮乐
- 9.ContentProvider内容提供者使用案例
- 安卓小案例收集五(内容提供者、动画)
- Android 内容提供者之读取联系人案例
- Android内容提供者的实现
- 05_android入门_GET方式实现登陆(在控件上显示服务端返回的内容)
- Android - 利用内容提供者删除通话记录
- (8)Launcher3客制化之ContentProvider内容提供者,实现其他应用修改数据库更新等操作
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 实习生活即将到来
- Event使用
- Android项目通过poi操作word文档
- 应用开发利器FXForms:iOS上实现各种Form View
- LA 2796 Concert Hall Scheduling 费用流
- 赵雅智_android通过内容提供者实现电话薄显示更新删除案例
- 高效程序员的特征:聪明,懒惰
- 第2次实验——算法基本功 与 综合思考
- select(Linux 编程)
- Windows上编译最新的CURL,含有zlib,openssl
- c2java Greedy 之任务调度
- 八皇后问题 JAVA程序代码以及运行结果
- 第1次实验——NPC问题(回溯算法、聚类分析)
- Sort List