首先什么是内容提供者?内容提供者是Android中的四大组件之一,今天研究了下利用内容提供者查询和修改数据库的数据,虽然简单了点,但也想分享给大家!
首先用android studio创建一model,再新建两个包,一个为PRovider,另外一个为DBUtil。
在main主页面这样写
<?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.liuqian.android_24_contentprovider.MainActivity"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/main_edittext_id"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="getData" android:text="获取数据" android:clickable="true"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="updateData" android:text="修改数据" android:clickable="true"/></LinearLayout>内含两个点击事件,它们的用处接着往下看就知道了在自己新建的那个DBUtil包里面新建一个工具类,用来连接数据库package DBUtil;import android.content.Context;import android.database.DatabaseErrorHandler;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;/** * Created by Administrator on 2017/02/07. */public class BDUtil extends SQLiteOpenHelper{ /** * 构造方法 * @param context 上下文 * @param name 数据库名字 * @param factory null * @param version 数据库版本 */ public BDUtil(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } //创建表的操作 调用一次 @Override public void onCreate(SQLiteDatabase db) { //创建表、 db.execSQL("create table student (_id integer primary key autoincrement,name,sex)"); db.execSQL("insert into student (name,sex) values('傻逼1','男')"); db.execSQL("insert into student (name,sex) values('傻逼2','男')"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }}然后在自己新建的那个provider包里面新建一个类MyContentProvider,继承ContentProvider,实现方法然后在清单文件application里做配置就好了,其中包括三个属性name,authorities,exported三个属性,authorities中写这个项目唯一的包名name写contentProvider这个类的所在位置就好了,而exported值为true就好了<!--配置内容提供者--><provider android:authorities="com.liuqian.android_24_contentprovider.PERSON" android:name="provider.MyContentProvider" android:exported="true"></provider>下面这个为内容提供者类的内容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 DBUtil.BDUtil;/** * Created by Administrator on 2017/02/07. */public class MyContentProvider extends ContentProvider{ private SQLiteDatabase db; private UriMatcher uriMatcher; @Override public boolean onCreate() { Log.i("test","onCreate"); BDUtil bdUtil=new BDUtil(getContext(),"G1508201.db",null,2); db = bdUtil.getReadableDatabase(); //实例化URI匹配器 uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); //添加规则// uriMatcher.addURI("com.liuqian.android_24_contentprovider.PERSON","student2",3); //01 查询所有 uriMatcher.addURI("com.liuqian.android_24_contentprovider.PERSON","student",1); //02 查询单个 uriMatcher.addURI("com.liuqian.android_24_contentprovider.PERSON","student/#",2); //添加修改规则 uriMatcher.addURI("com.liuqian.android_24_contentprovider.PERSON","student2",3); return false; } @Nullable @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { //根据URI匹配器开始匹配 int code=uriMatcher.match(uri); switch (code){ case 1: //查询所有 return db.query(false,"student",projection,selection,selectionArgs,null,null,sortOrder,null); case 2: //查询单个 long id= ContentUris.parseId(uri); return db.rawQuery("select * from student where _id=?",new String [] {id+""}); } return null; } @Nullable @Override public String getType(Uri uri) { return null; } @Nullable @Override public Uri insert(Uri uri, ContentValues values) { return null; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { return 0; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { int code=uriMatcher.match(uri); if(code==3){// 执行修改语句 db.update("student",values,"",new String [] {}); return 1; } return 0; }}//接下来的步骤也不多了,就是在main那个类里面执行相对应的操作就好了package com.liuqian.android_24_contentprovider;import android.content.ContentResolver;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;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.EditText;import android.widget.Toast;public class MainActivity extends AppCompatActivity { private EditText main_edittext_id; private ContentResolver contentResolver; private Uri uri; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); main_edittext_id = (EditText) findViewById(R.id.main_edittext_id); //获取内容访问者 contentResolver = getContentResolver(); //insertData(); } private void insertData() { //自动增加数据 ContentValues contentValues=new ContentValues(); contentValues.put("name","嘻哈"); contentValues.put("sex","男"); uri = Uri.parse("content://com.liuqian.android_24_contentprovider.PERSON/student2"); contentResolver.insert(uri,contentValues); } //修改数据 public void updateData(View view){ uri=Uri.parse("content://com.liuqian.android_24_contentprovider.PERSON/student2"); ContentValues values=new ContentValues(); values.put("_id","1"); values.put("name","aa"); values.put("sex","女"); int aa=contentResolver.update(uri,values,"",new String [] {}); if(aa==1){ Toast.makeText(this, "修改成功!", Toast.LENGTH_SHORT).show(); } } //getData public void getData(View view){ //判断输入框的值是否为空 if(TextUtils.isEmpty(main_edittext_id.getText().toString())){ //为空则查询所有 //content:// 为协议 uri = Uri.parse("content://com.liuqian.android_24_contentprovider.PERSON/student"); }else{ //查询单个 /** * 直接query传参 类似web传参 Uri匹配器 */ String id=main_edittext_id.getText().toString(); uri=Uri.parse("content://com.liuqian.android_24_contentprovider.PERSON/student/"+id); } Cursor cursor=contentResolver.query(uri,null,null,null,null); while (cursor.moveToNext()){ int id=cursor.getInt(cursor.getColumnIndex("_id")); String name=cursor.getString(cursor.getColumnIndex("name")); String sex=cursor.getString(cursor.getColumnIndex("sex")); Log.i("test",id+name+sex); } }}·我今天的分享到这来就结束了!本人是第一次发表博客,有异议的话请指正,谢谢!
新闻热点
疑难解答