Android学习笔记-ContentProvider操作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 @Override 32 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 @Override 42 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 @Override 118 public String getType(Uri uri) { 119 // TODO: Implement this to handle requests for the MIME type of the data 120 // 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 @Override 41 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 @Override 21 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 @Override 63 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 @Override 75 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 //优化ListView 117 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 @Override 24 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 //转换URI 66 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 @Override 84 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操作的主要内容,如果未能解决你的问题,请参考以下文章