contentprovider的创建主要是分享应用的数据库的数据,创建主要可分为4步:
1、创建数据库(注意即使创建了数据库类,只有在调用了sqLiteOpenHelper.getWritableDatabase(),数据库才会创建,而在清单文件里配置了provider,一开始就会加载,因此在provider的onCreate()方法里调用这个函数创建数据库。
2、创建类继承contentProvider,在里面定义数据库的authority与后面mainfest里面的一致,代表content的主机名,相当于数据库地址,并且定义表的信息和uri的适配器,并添加uri到适配器中,当然这些静态常量也可以另外定义一个MetaData类来存储。
3、在mainfest 注册provider,主要包括contentProvder的name和authority属性,demo中都是定义为包名+contentprovider类。
4、在activity中利用getContentReceiver来得到contentReceiver对象操作数据库。
下面根据以上步骤展示下代码:
1、数据库构建
package com.example.user.mcontentproviderdemo; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; /** * Created by user on 2016/10/17. */ public class MyDatabace extends SQLiteOpenHelper { final static String DATABACE_NAME ="MyFriends"; final static int DATABACE_VISION =1; private String CREATE_FRIEND = "create table friends( _id integer primary key autoincrement, " + "name text not null, mobile text not null)";// public MyDatabace(Context context) { super(context, DATABACE_NAME, null, DATABACE_VISION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_FRIEND); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
2 contentprovider类的构建:
package com.example.user.mcontentproviderdemo; import android.content.ContentProvider; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.net.Uri; import android.provider.ContactsContract; import android.support.annotation.Nullable; import java.io.File; /** * Created by user on 2016/10/18. */ public class MyContentProvider extends ContentProvider{ //要共享的数据库 private static SQLiteOpenHelper sqLiteOpenHelper; public final static String AUTHORITY = "com.example.user.mcontentproviderdemo.MyContentProvider"; //**********************为每个表定义变量信息,例子中就一个friend表*********************** //*****************friends表**************************************// public final static String FRIENDS_TABLE ="friends";//表名 //friends表的列明 public final static String FRIENDS_ID = "_id"; public final static String FRIENDS_NAME = "name"; public final static String FRIENDS_MOBILE = "mobile"; public final static int ALL_FRIENDS = 100; //当uri匹配是整个表格时候得返回值 public final static int ONE_FRIENDS = 1 ;//当uri匹配是整个表格的某一条目时候返回值 public final static String DEFAULT_SORT_ORDER = FRIENDS_ID+" desc";//定义默认排序 //getType会用到的返回的类型 private final static String ITEM_FRIENDS_TABLE_MIME = "vnd.android.cursor.item/vnd.com.example.user.mcontentproviderdemo.friends"; private final static String ALL_FRIENDS_TABLE_MIME = "vnd.android.cursor.dir/vnd.com.example.user.mcontentproviderdemo.friends"; private static final UriMatcher sUriMatcher; static { //初始化匹配器 sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); // 为friends表添加匹配的uri,当匹配时返回后面的整数值 sUriMatcher.addURI(AUTHORITY , File.separator+FRIENDS_TABLE , ALL_FRIENDS); sUriMatcher.addURI(AUTHORITY , File.separator+FRIENDS_TABLE+"/*",ONE_FRIENDS); } @Override public boolean onCreate() { sqLiteOpenHelper = new MyDatabace(getContext()); SQLiteDatabase db = sqLiteOpenHelper.getWritableDatabase(); db.close(); return false; } @Nullable @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { Cursor cursor = null; SQLiteDatabase db=sqLiteOpenHelper.getWritableDatabase(); cursor=db.query("friends", projection, selection, selectionArgs, null, null ,null );//DEFAULT_SORT_ORDER return cursor; } @Nullable @Override public String getType(Uri uri) { switch (sUriMatcher.match(uri)) { case ALL_FRIENDS: return ALL_FRIENDS_TABLE_MIME; case ONE_FRIENDS: return ITEM_FRIENDS_TABLE_MIME; default: return "error"; } } @Nullable @Override public Uri insert(Uri uri, ContentValues values) { switch (sUriMatcher.match(uri)) { case ALL_FRIENDS: System.out.println("匹配成功"); SQLiteDatabase sqLiteDatabase = sqLiteOpenHelper.getWritableDatabase(); sqLiteDatabase.insert("friends" , null ,values); sqLiteDatabase.close(); default: break; } 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) { return 0; } }
3、配置文件中注册:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.user.mcontentproviderdemo"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <provider android:name="com.example.user.mcontentproviderdemo.MyContentProvider" android:authorities="com.example.user.mcontentproviderdemo.MyContentProvider" > </provider> </application> </manifest>
4 在activity中使用:
package com.example.user.mcontentproviderdemo; import android.content.ContentProvider; import android.content.ContentResolver; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import java.net.URI; public class MainActivity extends AppCompatActivity { Uri uri = Uri.parse("content://"+ MyContentProvider.AUTHORITY+"/"+MyContentProvider.FRIENDS_TABLE); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // ******************************插入********************************* ContentValues contentValues = new ContentValues(); //id 在数据库是主键且自增长,所有可以不添加,当添加时候若数据库内是唯一的就会添加进数据库,若不是就不会插入此条 // contentValues.put(MyContentProvider.FRIENDS_ID,111); contentValues.put(MyContentProvider.FRIENDS_NAME , "db"); contentValues.put(MyContentProvider.FRIENDS_MOBILE , "1356076"); Uri uri2 =getContentResolver().insert(uri,contentValues); // System.out.println(uri2.toString()); // ******************************查询********************************* Cursor cursor = getContentResolver().query(uri , null , null , null ,null);//new String[]{"name"} //遍历cursor while(cursor.moveToNext()) { Bundle bundle = cursor.getExtras(); String name = cursor.getString(cursor.getColumnIndex(MyContentProvider.FRIENDS_NAME)); String mobile = cursor.getString(cursor.getColumnIndex(MyContentProvider.FRIENDS_MOBILE)); int id = cursor.getInt(cursor.getColumnIndex(MyContentProvider.FRIENDS_ID )); System.out.println("id:"+id+" name:" + name + " mobile:"+mobile); } } }