赵雅智_android通过内容提供者实现电话薄显示更新删除案例

来源:互联网 发布:淘宝网服装男士 编辑:程序博客网 时间:2024/06/03 21:59

需求分析:

通过ContentResolver操作内容提供者的数据,将姓名,电话显示在listView中,并带有添加和删除按钮进行相应操作

实现思路步骤:

  1. Adater模型层
    1. 创建内容解析器对象 ContentResolver
    2. 定义URI
  2. 自定义CursorAdapter
    1. 实现构造器public MyCursorAapter(Context context, Cursor c, int flags)
    2. 实现public View newView(Context context, Cursor cursor, ViewGroup parent)方法
    3. 实现public void bindView(View view, Context context, Cursor cursor)
      1. 给adapter设置显示数据
        1. 查找控件
        2. 给控件设置值
      2. 删除数据
        1. contentResolver的delete方法删除数据
        2. 重新初始化数据
      3. 更新数据
        1. 新建activity和布局文件
        2. MainActivity中通过intent跳转activity并将点击对应位置的值传到更新界面
          1. 获取相对应的数据
          2. 通过intent跳转activity
          3. 用startActivityForResult发送带有数据的返回值
        3. 查找控件并赋值
          1. 查找控件
          2. 将intent传过来的值赋给控件
        4. 创建内容解析器
        5. 通过内容解析器更新数据
          1. uri声明
          2. 通过ContentValues放值
        6. 将结果码和更新结果值传回MainActivity
        7. 在MainActivity中重写onActivityResult方法处理更新成功或者失败
  3. 用内容解析器初始化数据并设置adapter
    1. contentResolver的query方法查找数据
    2. 在视图中绑定

实现效果

主界面

删除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
原创粉丝点击