Android 自定义ContentProvider Demo
来源:互联网 发布:c语言编写图形 编辑:程序博客网 时间:2024/05/23 14:03
ContenProvider:简单查询及修改
1.提供数据来源,在本地创建数据库文件
package util;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;/** * Created by ASUS on 2017/2/7. */public class DbUtil extends SQLiteOpenHelper{ public DbUtil(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } //创建表的操作 @Override public void onCreate(SQLiteDatabase db) { //创建表 db.execSQL("create table person(_id integer primary key autoincrement,name,age)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }}
2.编写简单布局文件
如图一:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" 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" android:orientation="vertical" tools:context="com.asus.android_16_sqlite.MainActivity"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="ID" android:id="@+id/et_main_id" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="用户名" android:id="@+id/et_main_username" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="年龄" android:id="@+id/et_main_userage" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="保存" android:onClick="save" android:layout_weight="1" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="查询" android:onClick="query" android:layout_weight="1" /> </LinearLayout> <ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@android:id/list"> </ListView></LinearLayout>
3.ContentProvider内容提供者,内容来源:数据库
首先写一个类,继承ContentProvider
他会重写6个方法,
如下:
package provider;import android.content.ContentProvider;import android.content.ContentUris;import android.content.ContentValues;import android.content.UriMatcher;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.net.Uri;import android.support.annotation.Nullable;import android.util.Log;import util.DbUtil;/** * Created by ASUS on 2017/2/8. */public class MyContentProvider extends ContentProvider{ private SQLiteDatabase db; private UriMatcher uriMatcher; @Override public boolean onCreate() { Log.i("test","onCreate"); DbUtil dbUtil=new DbUtil(getContext(),"person.db",null,2); db = dbUtil.getReadableDatabase(); //实例化URI匹配器 uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); //添加规则 //1.查询所有 uriMatcher.addURI("com.asus.android_16_sqlite.PERSON","person",1); //2.查询单个 uriMatcher.addURI("com.asus.android_16_sqlite.PERSON","person/#",2);// uriMatcher.addURI("com.asus.android_16_sqlite.PERSON","person/#/#/#",3); return false; } @Nullable @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { //根据URI匹配器开始匹配uri int code=uriMatcher.match(uri); switch (code) { case 1 : //查询所有 Log.i("test","query所有"); //获取数据库中所有的数据 return db.query(false,"person",projection,selection,selectionArgs,null,null,sortOrder,null); case 2 : //查询单个 //获取#的值 long id=ContentUris.parseId(uri); Log.i("test","query单个"); return db.rawQuery("select * from person where _id=?",new String[]{id+""}); } return null; } @Nullable @Override public String getType(Uri uri) { Log.i("test","getType"); return null; } @Nullable @Override public Uri insert(Uri uri, ContentValues values) { Log.i("test","insert"); return null; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { Log.i("test","delete"); return 0; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { Log.i("test","update");// db.execSQL(" update person set name=?,age=? where _id=? ",new String[]{""+2,""+2,""+2});// String str=""+uriMatcher.match(uri);// Log.i("text",str); return db.update("person",values,selection,selectionArgs); }}4.MainActivity:
package com.asus.android_24_contentprovider;import android.content.ContentResolver;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;import android.support.v7.app.AlertDialog;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.text.TextUtils;import android.util.Log;import android.view.View;import android.widget.AdapterView;import android.widget.Button;import android.widget.EditText;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.SimpleCursorAdapter;import android.widget.TextView;public class MainActivity extends AppCompatActivity { private ContentResolver contentResolver; private EditText et_main_id; private Uri uri; private ListView listview_main_person; private Cursor cursor; private SimpleCursorAdapter simpleCursorAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); contentResolver = getContentResolver(); et_main_id = (EditText) findViewById(R.id.et_main_id); listview_main_person = (ListView) findViewById(R.id.listview_main_person); } public void getData(View view){ //判断输入框的值是否为空 if (TextUtils.isEmpty(et_main_id.getText().toString())){ //为空,查询所有 uri = Uri.parse("content://com.asus.android_16_sqlite.PERSON/person"); }else{ //不为空,查询单个 String id=et_main_id.getText().toString(); uri = Uri.parse("content://com.asus.android_16_sqlite.PERSON/person/"+id); } cursor = contentResolver.query(uri,null,null,null,null); simpleCursorAdapter = new SimpleCursorAdapter(this, R.layout.items_listview,cursor,new String[]{"_id","name","age"},new int[]{R.id.tv_items_id,R.id.tv_items_name,R.id.tv_items_age}); //给ListView设置适配器 listview_main_person.setAdapter(simpleCursorAdapter); //给ListView设置长按事件 listview_main_person.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { private TextView tv_dialog_id; private EditText et_dialog_age; private EditText et_dialog_name; @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { LinearLayout root= (LinearLayout) view; String _id=((TextView) root.findViewById(R.id.tv_items_id)).getText().toString(); String name=((TextView) root.findViewById(R.id.tv_items_name)).getText().toString(); String age=((TextView) root.findViewById(R.id.tv_items_age)).getText().toString(); final AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this); final AlertDialog alertDialog=builder.create(); //点击空白处,不取消对话框 alertDialog.setCancelable(false);// View v= LayoutInflater.from(MainActivity.this).inflate(R.layout.activity_dialog,null); View v=View.inflate(MainActivity.this,R.layout.activity_dialog,null); tv_dialog_id = (TextView) v.findViewById(R.id.tv_dialog_id); et_dialog_name = (EditText) v.findViewById(R.id.et_dialog_name); et_dialog_age = (EditText) v.findViewById(R.id.et_dialog_age); tv_dialog_id.setText(_id); et_dialog_name.setText(name); et_dialog_age.setText(age); ((Button)v.findViewById(R.id.bt_dialog_ok)).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String id=tv_dialog_id.getText().toString(); String name=et_dialog_name.getText().toString(); String age=et_dialog_age.getText().toString();// Toast.makeText(MainActivity.this, ""+ et_dialog_name.getText().toString(), Toast.LENGTH_SHORT).show(); uri = Uri.parse("content://com.asus.android_16_sqlite.PERSON/person/"); ContentValues values=new ContentValues(); values.put("name",""+et_dialog_name.getText().toString()); values.put("age",""+et_dialog_age.getText().toString()); contentResolver.update(uri,values,"_id=?",new String[]{id}); //重新查询,刷新 cursor = contentResolver.query(uri,null,null,null,null); //通知适配器发生该变 simpleCursorAdapter.changeCursor(cursor); //关闭当前的对话框 alertDialog.dismiss(); } }); ((Button)v.findViewById(R.id.bt_dialog_no)).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //关闭当前的对话框 alertDialog.dismiss(); } }); alertDialog.setView(v); alertDialog.show(); return true; } }); while (cursor.moveToNext()){ int id=cursor.getInt(cursor.getColumnIndex("_id")); String name=cursor.getString(cursor.getColumnIndex("name")); int age=cursor.getInt(cursor.getColumnIndex("age")); Log.i("test",id+" "+name+" "+age); } }}5.记得要注册内容提供者在AndroidManifest.xml中
<!--配置内容提供者--><provider android:authorities="com.asus.android_16_sqlite.PERSON" android:name="provider.MyContentProvider" android:exported="true" ></provider>提示,本DemoListView设置长按功能,布局文件自己写即可。
这样,自定义内容提供者就写好了。ContentResolver:简单查询及修改然后,我们写内容访问者:步骤差不多:1.写布局文件如图二<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" 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" android:orientation="vertical" tools:context="com.asus.android_24_contentprovider.MainActivity"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/et_main_id" android:hint="请输入ID" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="获取数据" android:onClick="getData" /> <ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/listview_main_person" > </ListView></LinearLayout>2.MainActvitypackage com.asus.android_24_contentprovider;import android.content.ContentResolver;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;import android.support.v7.app.AlertDialog;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.text.TextUtils;import android.util.Log;import android.view.View;import android.widget.AdapterView;import android.widget.Button;import android.widget.EditText;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.SimpleCursorAdapter;import android.widget.TextView;public class MainActivity extends AppCompatActivity { private ContentResolver contentResolver; private EditText et_main_id; private Uri uri; private ListView listview_main_person; private Cursor cursor; private SimpleCursorAdapter simpleCursorAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); contentResolver = getContentResolver(); et_main_id = (EditText) findViewById(R.id.et_main_id); listview_main_person = (ListView) findViewById(R.id.listview_main_person); } public void getData(View view){ //判断输入框的值是否为空 if (TextUtils.isEmpty(et_main_id.getText().toString())){ //为空,查询所有 uri = Uri.parse("content://com.asus.android_16_sqlite.PERSON/person"); }else{ //不为空,查询单个 String id=et_main_id.getText().toString(); uri = Uri.parse("content://com.asus.android_16_sqlite.PERSON/person/"+id); } cursor = contentResolver.query(uri,null,null,null,null); simpleCursorAdapter = new SimpleCursorAdapter(this, R.layout.items_listview,cursor,new String[]{"_id","name","age"},new int[]{R.id.tv_items_id,R.id.tv_items_name,R.id.tv_items_age}); //给ListView设置适配器 listview_main_person.setAdapter(simpleCursorAdapter); //给ListView设置长按事件 listview_main_person.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { private TextView tv_dialog_id; private EditText et_dialog_age; private EditText et_dialog_name; @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { LinearLayout root= (LinearLayout) view; String _id=((TextView) root.findViewById(R.id.tv_items_id)).getText().toString(); String name=((TextView) root.findViewById(R.id.tv_items_name)).getText().toString(); String age=((TextView) root.findViewById(R.id.tv_items_age)).getText().toString(); final AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this); final AlertDialog alertDialog=builder.create(); //点击空白处,不取消对话框 alertDialog.setCancelable(false);// View v= LayoutInflater.from(MainActivity.this).inflate(R.layout.activity_dialog,null); View v=View.inflate(MainActivity.this,R.layout.activity_dialog,null); tv_dialog_id = (TextView) v.findViewById(R.id.tv_dialog_id); et_dialog_name = (EditText) v.findViewById(R.id.et_dialog_name); et_dialog_age = (EditText) v.findViewById(R.id.et_dialog_age); tv_dialog_id.setText(_id); et_dialog_name.setText(name); et_dialog_age.setText(age); ((Button)v.findViewById(R.id.bt_dialog_ok)).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String id=tv_dialog_id.getText().toString(); String name=et_dialog_name.getText().toString(); String age=et_dialog_age.getText().toString();// Toast.makeText(MainActivity.this, ""+ et_dialog_name.getText().toString(), Toast.LENGTH_SHORT).show(); uri = Uri.parse("content://com.asus.android_16_sqlite.PERSON/person/"); ContentValues values=new ContentValues(); values.put("name",""+et_dialog_name.getText().toString()); values.put("age",""+et_dialog_age.getText().toString()); contentResolver.update(uri,values,"_id=?",new String[]{id}); //重新查询,刷新 cursor = contentResolver.query(uri,null,null,null,null); //通知适配器发生该变 simpleCursorAdapter.changeCursor(cursor); //关闭当前的对话框 alertDialog.dismiss(); } }); ((Button)v.findViewById(R.id.bt_dialog_no)).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //关闭当前的对话框 alertDialog.dismiss(); } }); alertDialog.setView(v); alertDialog.show(); return true; } }); while (cursor.moveToNext()){ int id=cursor.getInt(cursor.getColumnIndex("_id")); String name=cursor.getString(cursor.getColumnIndex("name")); int age=cursor.getInt(cursor.getColumnIndex("age")); Log.i("test",id+" "+name+" "+age); } }}
0 0
- Android 自定义ContentProvider Demo
- Android Custom ContentProvider Demo
- Android--ContentProvider小demo
- Android 自定义ContentProvider
- Android自定义contentprovider
- [android]自定义ContentProvider
- Android 自定义ContentProvider
- 36.Android 自定义ContentProvider
- Android自定义ContentProvider
- Android 自定义ContentProvider
- 【Android 开发教程】自定义ContentProvider
- Android组件之自定义ContentProvider
- Android组件之自定义ContentProvider
- Android组件之自定义ContentProvider
- Android组件之自定义ContentProvider
- Android组件之自定义ContentProvider
- Android组件之自定义ContentProvider
- Android组件之自定义ContentProvider
- JavaScript localeCompare() 方法
- 71道经典Android面试题,涵盖了所有android知识点,值得学习和思考
- Java容器(三):LinkedList源码分析
- c——显式类型转换
- 详解TCP中的三次握手和四次挥手
- Android 自定义ContentProvider Demo
- web前端之json排查和格式变换
- LDO的作用
- 【Python】学习笔记——-2.5、循环
- 每天一个linux命令:which命令
- c——运算符——内置类型
- canvas粒子时钟
- c——运算符——复合类型
- 【Python】学习笔记——-2.6、使使用dict和set