首页 > 代码库 > Android学习笔记-ContentProvider操作
Android学习笔记-ContentProvider操作
---恢复内容开始---
之前写了一个用SQlite来实现增删改查的应用,今天又新学了一个用ContentProvider来操作的增删改查
首先ContentProvider是用来共享数据的,那么咱们先来建立一个数据源,之后用其他程序获得共享的ContentProvider,来实现CRUD
数据源结构,一共三个Java文件
SQLDatabaseHelper.java
1 package com.example.sqlcz; 2 3 import android.content.Context; 4 import android.database.sqlite.SQLiteDatabase; 5 import android.database.sqlite.SQLiteOpenHelper; 6 import android.util.Log; 7 8 /** 9 * Created by Administrator on 2016/9/22.10 */11 public class SQLDatabaseHelper extends SQLiteOpenHelper {12 private static SQLDatabaseHelper sqlDatabaseHelper;13 private static final String DB_NAME = "wxhl.db";14 public static final String TABLE_NAME = "t_person";15 16 private static final int VERSION = 1;17 private final String TAG = "--main--";18 19 private SQLDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {20 super(context, name, factory, version);21 }22 23 public static synchronized SQLDatabaseHelper getInstance(Context context) {24 if (sqlDatabaseHelper == null) {25 sqlDatabaseHelper = new SQLDatabaseHelper(context, DB_NAME, null, VERSION);26 27 }28 return sqlDatabaseHelper;29 }30 //创建数据表31 @Override32 public void onCreate(SQLiteDatabase db) {33 String sql = "create table if not exists t_person"+34 "(_id integer primary key autoincrement," +35 "name text not null,age int default 18, sex text)";36 db.execSQL(sql);37 38 Log.e(TAG, "onCreate: 执行---");39 }40 41 @Override42 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {43 44 }45 }
SQL文件主要是用来建立数据库,已经数据表,
MyContentProvider.java 核心代码
1 package com.example.sqlcz; 2 3 import android.content.ContentProvider; 4 import android.content.ContentUris; 5 import android.content.ContentValues; 6 import android.content.UriMatcher; 7 import android.database.Cursor; 8 import android.database.sqlite.SQLiteDatabase; 9 import android.net.Uri; 10 import android.util.Log; 11 12 /** 13 * Created by Administrator on 2016/9/22. 14 */ 15 public class MyContentProvider extends ContentProvider { 16 17 private static final String TAG = "--main--"; 18 private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); 19 private static final int SINGLE = 1;//单条数据 20 private static final int MULTIPLE = 2;//全部数据 21 22 private SQLDatabaseHelper sqlDatabaseHelper; 23 private SQLiteDatabase db; 24 25 static { 26 uriMatcher.addURI("com.wuxianedu.provider", "t_person", MULTIPLE); 27 uriMatcher.addURI("com.wuxianedu.provider","t_person" + "/#", SINGLE); 28 } 29 30 31 32 @Override 33 public boolean onCreate() { 34 //获取数据库实例 35 sqlDatabaseHelper = SQLDatabaseHelper.getInstance(getContext()); 36 db = sqlDatabaseHelper.getWritableDatabase(); 37 return false; 38 } 39 //新增数据 40 @Override 41 public Uri insert(Uri uri, ContentValues values) { 42 switch (uriMatcher.match(uri)) { 43 case MULTIPLE: 44 long id = db.insert("t_person", null, values); 45 Uri newUri = ContentUris.withAppendedId(uri, id); 46 // db.close(); 47 return newUri; 48 } 49 // db.close(); 50 throw new IllegalArgumentException("无效的 Uri :" + uri); 51 } 52 //删除数据 53 @Override 54 public int delete(Uri uri, String selection, String[] selectionArgs) { 55 // SQLiteDatabase db = sqlDatabaseHelper.getWritableDatabase(); 56 int count = 0; 57 switch (uriMatcher.match(uri)) { 58 case SINGLE: 59 // long id = ContentUris.parseId(uri); 60 // count = db.delete(SQLDatabaseHelper.TABLE_NAME, "id = ?", new String[]{String.valueOf(id)}); 61 count = db.delete("t_person", selection, selectionArgs); 62 // db.close(); 63 return count; 64 case MULTIPLE: 65 count = db.delete("t_person", null, null); 66 // db.close(); 67 return count; 68 } 69 // db.close(); 70 throw new IllegalArgumentException("无效的 Uri :" + uri); 71 } 72 //查询数据 73 @Override 74 public Cursor query(Uri uri, String[] projection, String selection, 75 String[] selectionArgs, String sortOrder) { 76 // SQLiteDatabase db = sqlDatabaseHelper.getWritableDatabase(); 77 Log.e(TAG, "query: ------"); 78 Cursor cursor = null; 79 switch (uriMatcher.match(uri)) { 80 case SINGLE: 81 // long id = ContentUris.parseId(uri); 82 // cursor = db.query(SQLDatabaseHelper.TABLE_NAME, null, "id = ?", new String[]{String.valueOf(id)}, null, null, null); 83 cursor = db.query("t_person", null, selection, selectionArgs, null, null, sortOrder); 84 // db.close(); 85 return cursor; 86 case MULTIPLE: 87 cursor = db.query("t_person", null, null, null, null, null, sortOrder); 88 // db.close(); 89 return cursor; 90 } 91 // db.close(); 92 throw new IllegalArgumentException("无效的 Uri :" + uri); 93 } 94 //修改数据 95 @Override 96 public int update(Uri uri, ContentValues values, String selection, 97 String[] selectionArgs) { 98 // SQLiteDatabase db = sqlDatabaseHelper.getWritableDatabase(); 99 100 int count = 0;101 switch (uriMatcher.match(uri)) {102 case SINGLE:103 // long id = ContentUris.parseId(uri);104 // count = db.update(SQLDatabaseHelper.TABLE_NAME, values, "id = ?", new String[]{String.valueOf(id)});105 count = db.update("t_person", values, selection, selectionArgs);106 // db.close();107 return count;108 case MULTIPLE:109 count = db.update("t_person", values, null, null);110 // db.close();111 return count;112 }113 // db.close();114 throw new IllegalArgumentException("无效的 Uri :" + uri);115 }116 117 @Override118 public String getType(Uri uri) {119 // TODO: Implement this to handle requests for the MIME type of the data120 // at the given URI.121 switch (uriMatcher.match(uri)) {122 case SINGLE:123 return "vnd.android.cursor.item/" + "t_person";124 case MULTIPLE:125 return "vnd.android.cursor.dir/" + "t_person";126 }127 throw new IllegalArgumentException("无效的 Uri :" + uri);128 }129 }
下面是共享数据的应用结构
Bean文件
1 package com.example.zuoye; 2 3 import java.io.Serializable; 4 5 /** 6 * Created by Administrator on 2016/9/22. 7 */ 8 public class JavaBean implements Serializable { 9 private static final long serialVersionUID = -5689121879237580927L;10 private int id;11 private String name;12 private int age;13 private String sex;14 15 public int getId() {16 return id;17 }18 public void setId(int id) {19 this.id = id;20 }21 public String getName() {22 return name;23 }24 public void setName(String name) {25 this.name = name;26 }27 public int getAge() {28 return age;29 }30 public void setAge(int age) {31 this.age = age;32 }33 public String getSex() {34 return sex;35 }36 public void setSex(String sex) {37 this.sex = sex;38 }39 40 @Override41 public String toString() {42 return "Wechat [name=" + name + ", area=" + sex + ", weCode=" + id + "]";43 }44 }
MainActivity.java
1 package com.example.zuoye; 2 3 import android.content.ContentResolver; 4 import android.content.Intent; 5 import android.database.Cursor; 6 import android.net.Uri; 7 import android.support.v7.app.AppCompatActivity; 8 import android.os.Bundle; 9 import android.util.Log;10 import android.view.Menu;11 import android.view.MenuItem;12 import android.widget.ListView;13 14 import java.util.ArrayList;15 import java.util.List;16 17 public class MainActivity extends AppCompatActivity {18 private MainAdapter mainAdapter;//构建数据源19 private List<JavaBean> list;20 @Override21 protected void onCreate(Bundle savedInstanceState) {22 super.onCreate(savedInstanceState);23 setContentView(R.layout.activity_main);24 ListView listview = (ListView) findViewById(R.id.liebiao);25 list = quyy();26 mainAdapter = new MainAdapter(this,list);27 listview.setAdapter(mainAdapter);28 }29 //查询ContentProvider共享的数据30 public List<JavaBean> quyy(){31 List<JavaBean> list = new ArrayList<JavaBean>();32 ContentResolver resolver = getContentResolver();33 String str = "content://com.wuxianedu.provider/t_person";34 Uri uri = Uri.parse(str);35 Cursor cursor = resolver.query(uri,null,null,null,null);36 while (cursor.moveToNext()){37 JavaBean java = new JavaBean();38 int id = cursor.getInt(cursor.getColumnIndex("_id"));39 int age = cursor.getInt(cursor.getColumnIndex("age"));40 String name = cursor.getString(cursor.getColumnIndex("name"));41 String sex = cursor.getString(cursor.getColumnIndex("sex"));42 Log.e("我是ID",id+"");43 java.setId(id);44 java.setName(name);45 java.setAge(age);46 java.setSex(sex);47 list.add(java);48 Log.e("main---",""+id+"--------------"+age+name+sex);49 }50 51 /* if(cursor !=null){52 cursor.close();53 cursor = null;54 }*/55 return list;56 }57 58 @Override //菜单的点击事件59 public boolean onCreateOptionsMenu(Menu menu) {60 getMenuInflater().inflate(R.menu.menu,menu);61 menu.findItem(R.id.add).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {62 @Override63 public boolean onMenuItemClick(MenuItem item) {64 //点击添加跳转65 Intent intent=new Intent(MainActivity.this,UpdateActivity.class);66 startActivityForResult(intent,5);67 return false;68 }69 });70 return super.onCreateOptionsMenu(menu);71 72 }73 //利用生命周期74 @Override75 protected void onResume() {76 super.onResume();77 //重新获取list数据78 list = quyy();79 //给list赋值 更新80 mainAdapter.setList(list);81 }82 }
下面是Adapter的代码
1 package com.example.zuoye; 2 3 import android.content.ContentResolver; 4 import android.content.ContentUris; 5 import android.content.Context; 6 import android.content.DialogInterface; 7 import android.content.Intent; 8 import android.net.Uri; 9 import android.support.v7.app.AlertDialog; 10 import android.util.Log; 11 import android.view.LayoutInflater; 12 import android.view.View; 13 import android.view.ViewGroup; 14 import android.widget.BaseAdapter; 15 import android.widget.Button; 16 import android.widget.TextView; 17 import android.widget.Toast; 18 19 import java.util.List; 20 21 /** 22 * Created by Administrator on 2016/9/22. 23 */ 24 public class MainAdapter extends BaseAdapter { 25 private Context context; 26 private List<JavaBean> list;//接收数据的LIST 27 private ContentResolver resolver; 28 29 //适配器 30 public MainAdapter(Context context, List<JavaBean> list){ 31 this.context = context; 32 this.list = list; 33 } 34 //更新集合用 35 public void setList(List<JavaBean> list) { 36 this.list = list; 37 notifyDataSetChanged(); 38 } 39 40 @Override 41 public int getCount() { 42 return list.size(); 43 } 44 45 @Override 46 public Object getItem(int position) { 47 return list.get(position); 48 } 49 50 @Override 51 public long getItemId(int position) { 52 return position; 53 } 54 55 @Override 56 public View getView(final int position, View convertView, ViewGroup parent) { 57 resolver =context.getContentResolver(); 58 final HUi hui; 59 if(convertView == null){ 60 hui = new HUi(); 61 convertView = LayoutInflater.from(context).inflate(R.layout.item_lie, null); 62 hui.name = (TextView) convertView.findViewById(R.id.tv_name); 63 hui.age = (TextView) convertView.findViewById(R.id.tv_age); 64 hui.sex = (TextView) convertView.findViewById(R.id.tv_sex); 65 hui.update = (Button) convertView.findViewById(R.id.but_name); 66 hui.delete = (Button) convertView.findViewById(R.id.but_delete); 67 //修改按钮 68 hui.update.setOnClickListener(new View.OnClickListener() { 69 @Override 70 public void onClick(View v) { 71 Intent intent = new Intent(context,UpdateActivity.class); 72 int ooon = (int) hui.update.getTag(); 73 Log.e("main---","------Adapterget出来的Id--------"+ooon); 74 JavaBean javabean = list.get(ooon); 75 intent.putExtra("name",javabean); 76 context.startActivity(intent); 77 } 78 }); 79 convertView.setTag(hui); 80 }else{ 81 hui = (HUi) convertView.getTag(); 82 } 83 final JavaBean java = list.get(position); 84 // hui.update.setTag(position); 85 hui.name.setText(java.getName()); 86 hui.age.setText(String.valueOf(java.getAge())); 87 hui.sex.setText(java.getSex()); 88 hui.delete.setTag(position); 89 hui.update.setTag(position); 90 //构建删除对话框 91 hui.delete.setOnClickListener(new View.OnClickListener() { 92 @Override 93 public void onClick(View v) { 94 AlertDialog.Builder builder = new AlertDialog.Builder(context); 95 builder.setMessage("确定删除吗?"); 96 builder.setPositiveButton("取消",null); 97 builder.setNegativeButton("确定", new DialogInterface.OnClickListener() { 98 @Override 99 public void onClick(DialogInterface dialog, int which) {100 //获取下标101 int on = (int) hui.delete.getTag()+1;102 String str = "content://com.wuxianedu.provider/t_person/"+java.getId();103 Uri uri = Uri.parse(str);104 long id = ContentUris.parseId(uri);105 int index = resolver.delete(uri,"_id = ? ",new String[]{String.valueOf(id)});106 list.remove(position);107 notifyDataSetChanged();108 Toast.makeText(context,"删除成功",Toast.LENGTH_SHORT).show();109 }110 }).show();111 112 }113 });114 return convertView;115 }116 //优化ListView117 class HUi {118 TextView name,age,sex;119 Button update,delete;120 }121 }
添加数据和修改数据代码
1 package com.example.zuoye; 2 3 import android.content.ContentResolver; 4 import android.content.ContentUris; 5 import android.content.ContentValues; 6 import android.content.Intent; 7 import android.net.Uri; 8 import android.support.v7.app.AppCompatActivity; 9 import android.os.Bundle;10 import android.util.Log;11 import android.view.View;12 import android.widget.Button;13 import android.widget.EditText;14 import android.widget.Toast;15 16 public class UpdateActivity extends AppCompatActivity implements View.OnClickListener {17 18 private EditText ed_name,ed_sex,ed_age;19 private JavaBean com;20 private Button xiugai,shanchu;21 private ContentResolver resolver;22 23 @Override24 protected void onCreate(Bundle savedInstanceState) {25 super.onCreate(savedInstanceState);26 setContentView(R.layout.activity_update);27 ed_name= (EditText) findViewById(R.id.ed_name);28 ed_age = (EditText) findViewById(R.id.ed_age);29 ed_sex = (EditText) findViewById(R.id.ed_sex);30 xiugai = (Button) findViewById(R.id.but_tianjia);31 shanchu = (Button) findViewById(R.id.but_queding);32 Intent on = getIntent();33 com = (JavaBean) on.getSerializableExtra("name");34 //这里是取值,是否为空,如果为空就是从添加用户过来的,如果不为空就是从增加数据过来的35 if(com == null){36 shanchu.setVisibility(View.GONE);37 }else{38 xiugai.setVisibility(View.GONE);39 ed_name.setText(com.getName()+"");40 ed_age.setText(String.valueOf(com.getAge())+"");41 ed_sex.setText(com.getSex()+"");42 }43 xiugai.setOnClickListener(this);44 shanchu.setOnClickListener(this);45 46 }47 private void SqlInsert(){48 ContentValues contentValues = new ContentValues();49 contentValues.put("name",ed_name.getText().toString());50 contentValues.put("age",ed_age.getText().toString());51 contentValues.put("sex",ed_sex.getText().toString());52 /* db.insert(contentValues);*/53 resolver = getContentResolver();54 String str = "content://com.wuxianedu.provider/t_person";55 Uri uri = Uri.parse(str);56 // long id = ContentUris.parseId(uri);57 Uri rUri = resolver.insert(uri,contentValues);58 Toast.makeText(UpdateActivity.this,"添加成功",Toast.LENGTH_SHORT).show();59 }60 //修改数据61 private void SqlUpdate(){62 resolver = getContentResolver();63 String str = "content://com.wuxianedu.provider/t_person/"+(com.getId());64 Log.e("main--get出来的ID-",""+com.getId());65 //转换URI66 Uri uri = Uri.parse(str);67 long id = ContentUris.parseId(uri);68 Log.e("main--uri出来的ID-",""+id+"");69 ContentValues values = new ContentValues();70 values.put("name",ed_name.getText().toString());71 values.put("age",ed_age.getText().toString());72 values.put("sex",ed_sex.getText().toString());73 int index = resolver.update(uri,values,"_id = ?",new String[]{String.valueOf(id)});;74 Toast.makeText(UpdateActivity.this,"修改成功",Toast.LENGTH_SHORT).show();75 }76 //判断77 protected void onActivityResult(int requestCode, int resultCode, Intent data) {78 if(requestCode != 5){79 80 }81 }82 83 @Override84 public void onClick(View v) {85 switch (v.getId()){86 case R.id.but_queding:87 SqlUpdate();88 break;89 case R.id.but_tianjia:90 SqlInsert();91 break;92 }93 }94 }
对了,还需要注册,在AndroidManfest.xml中进行注册,代码如下
<provider
android:name=".MyContentProvider"
android:authorities="com.wuxianedu.provider"
android:enabled="true"
android:exported="true">
</provider>
注:注册时在第一个应用里面注册,第二个不用
下面把布局代码贴一下,
第二个应用activity_main.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 //这里面只有一个ListView, 7 tools:context="com.example.zuoye.MainActivity"> 8 9 <ListView android:id="@+id/liebiao"10 android:layout_width="wrap_content"11 android:layout_height="wrap_content"12 android:text="Hello World!" />13 </RelativeLayout>
Adapter的布局文件
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="horizontal" android:layout_width="match_parent" 4 android:layout_height="match_parent"> 5 <LinearLayout android:layout_width="0dp" 6 android:layout_height="wrap_content" 7 android:layout_weight="5"> 8 <TextView android:id="@+id/tv_name" 9 android:layout_width="0dp" android:layout_gravity="center_vertical"10 android:layout_height="wrap_content"11 android:text="aaa" android:layout_weight="1"12 android:gravity="center"/>13 14 <TextView android:id="@+id/tv_age"15 android:layout_width="wrap_content"16 android:layout_height="wrap_content" android:layout_gravity="center_vertical"17 android:text="aaa" android:layout_weight="1"18 android:gravity="center"/>19 <TextView android:id="@+id/tv_sex"20 android:layout_width="wrap_content"21 android:layout_height="wrap_content" android:layout_gravity="center_vertical"22 android:text="aaa" android:layout_weight="1"23 android:gravity="center"/>24 </LinearLayout>25 <Button android:id="@+id/but_name"26 android:layout_width="0dp"27 android:layout_height="40dp"28 android:layout_marginTop="2dp"29 android:text="修改" android:layout_weight="1"30 android:gravity="center" android:background="#3F51B5"31 android:textColor="#FFFFFF" android:padding="10dp"32 android:layout_marginRight="10dp"/>33 34 <Button android:id="@+id/but_delete"35 android:layout_width="0dp"36 android:layout_height="40dp"37 android:layout_marginTop="2dp"38 android:text="删除" android:layout_weight="1"39 android:gravity="center" android:background="#3F51B5"40 41 android:textColor="#FFFFFF" android:layout_marginRight="10dp"/>42 </LinearLayout>
修改和添加用户的界面
<?xml version="1.0" encoding="utf-8"?><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="com.example.zuoye.UpdateActivity"> <EditText android:id="@+id/ed_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入姓名"/> <EditText android:id="@+id/ed_age" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入年龄" android:layout_below="@+id/ed_name"/> <EditText android:id="@+id/ed_sex" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入性别" android:layout_below="@+id/ed_age"/> <Button android:id="@+id/but_queding" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="修改用户" android:layout_below="@+id/ed_sex"/> <Button android:id="@+id/but_tianjia" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="添加用户" android:layout_below="@+id/ed_sex"/></RelativeLayout>
好了,到这里就全部完成了,最后时限效果是这样的
---恢复内容结束---
Android学习笔记-ContentProvider操作
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。