- 浏览: 4151365 次
最新评论
赵雅智_android通过内容提供者实现电话薄显示更新删除案例
需求分析:
通过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介绍一样
布局文件
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; @Override protected 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); } @Override protected 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去拿控件 @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { return mInflater.inflate(R.layout.list_item_user, parent, false); } @Override public 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() { @Override public 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() { @Override public 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; @Override protected 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
@Override public 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方法处理
@Override protected 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
相关推荐
Android通过内容提供者读取联系人,手机上必须要有联系人数据,也可以直接在真机上运行
android内容提供者
使用android通讯录中的内容提供者,实现查询和增加联系人。经测试,可用
传智播客_Andorid_20天精通Android开发视频_第13天视频_视频_01_内容提供者原理.avi
android 内容提供者 安卓 初级 老鸟勿入
自定义内容提供者,和调用系统联系人 ,android
Android项目实战--手机卫士26--内容提供者与内容观察者
一个通过电话簿的内容提供器获取电话簿中联系人及相关信息进行显示的电话通讯录
android的内容提供者contentprovider的应用, 采用ContentProvider对外共享数据和监听ContentProvider中数据的变化
Android 内容提供者、解释者和观察者小例子 两个个程序源码
android_大华秤demo,内部ip自行配置,自行设定大华秤ip后再demo中配置大华秤的ip,然后用demo里的数据执行写入。(基于androidStudio版本的不同,下载后请自行编译) android对接大华条码秤方案:大华对外并没有...
NULL 博文链接:https://2528.iteye.com/blog/1062079
本文档按“现状”提供,我不对本文档的任何 陈述、信息和内容的准确性、可靠性、完整性、适销性、特定目的性和非侵权性提供任何明示 或暗示的声明或保证。本文档仅作为使用指导的参考。
本文档按“现状”提供,我不对本文档的任何 陈述、信息和内容的准确性、可靠性、完整性、适销性、特定目的性和非侵权性提供任何明示 或暗示的声明或保证。本文档仅作为使用指导的参考。
gobelieve_IM_SDK_android_demo.开源代码的IMSDK平台,提供无限定制的可能性 可以为企业提供单独部署服务器,官网:http://developer.gobelieve.io/。
为病人创建了Android应用程序,他们可以根据可用的时隙使用应用程序预订预约,医生可以根据优先级批准或拒绝预约,医生也可以提供处方,病人可以查看他们的Prescrip…。
Andorid.view.MenuItem代表每个菜单项,android.view.SubMenu代表子菜单,其三者的关系如下图所示,子菜单可以包裹多个菜单项,SubMenu继承了Menu的addSubMenu方法,但不能调用,因为不能嵌套调用。...
android系统上用于检测应用程序或硬件更新,并提供空中下载服务的OTA客户端。
斑马打印机api类库。提供文字打印,及图片打印功能。使用connecton类链接蓝牙打印机。
NULL 博文链接:https://justsee.iteye.com/blog/936612