ContentProvider介绍:
ContentProvider是Android系统中能实现所有应用程序共享的一种数据存储方式,由于数据通常在各应用间的是互相私密的,所以此存储方式较少使用,但是其又是必不可少的一种存储方式。例如音频,视频,图片和通讯录,一般都可以采用此种方式进行存储。
其实是比较低调的一个,日常开发中使用的频率也没那三位多。它的诞生就是为了给不同应用提供内容访问,自然在我们研究的“多进程通信方式”之中。ContentProvider 封装了数据的跨进程传输,我们可以直接使用 getContentResolver() 拿到 ContentResolver 进行增删改查即可。ContentProvider 以一个或多个表(与在关系型数据库中的表类似)的形式将数据呈现给外部应用。 行表示提供程序收集的某种数据类型的实例,行中的每个列表示为实例收集的每条数据。
app提供的内容:
MySqliteHelper(创建的一个数据库,名字叫Students , 版本号是 1 )
import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class MySqliteHelper extends SQLiteOpenHelper { private static String sqlName = "Students"; private static int version = 1; public MySqliteHelper(Context context) { super(context, sqlName, null, version); // TODO Auto-generated constructor stub } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub db.execSQL("create table Student(id integer primary key autoincrement,name varchar(20),age varchar(10))"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub } }
MyProvider(使用UriMatcher本质上是文本过滤器,就不用手动过滤字符串了,如果用手动比较麻烦,维护性也不好)
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; public class MyProvider extends ContentProvider{ private MySqliteHelper helper; private SQLiteDatabase database; private String tabName="Student"; private UriMatcher matcher; private static final int STUDENT=666; private String authority="com.example.csdn.MyProvider"; @Override public boolean onCreate() { // TODO Auto-generated method stub helper=new MySqliteHelper(getContext()); matcher=new UriMatcher(UriMatcher.NO_MATCH); matcher.addURI(authority, tabName, STUDENT); return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // TODO Auto-generated method stub int code=matcher.match(uri); database=helper.getReadableDatabase(); Cursor cursor=database.query(tabName, projection, selection, null, null, null, null); return cursor; } @Override public String getType(Uri uri) { // TODO Auto-generated method stub return null; } @Override public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub int code=matcher.match(uri); database=helper.getWritableDatabase(); database.insert(tabName, null, values); //将这个值插入到tabName中,对应这个值的编号 long studentid=database.insert(tabName, null, values); Uri studenturi=ContentUris.withAppendedId(uri, studentid); return studenturi; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // TODO Auto-generated method stub int code=matcher.match(uri); database=helper.getWritableDatabase(); long studentid=database.delete(tabName, selection, selectionArgs); return 0; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // TODO Auto-generated method stub int code=matcher.match(uri); database=helper.getWritableDatabase(); long studentid=database.update(tabName, values, selection, selectionArgs); return 0; } }
需要在配置清单注册:(记得一定要声明authorities , 不指定这个属性的话其他应用,无法通过Uri访问你的数据库)
<provider android:name="com.example.csdn.MyProvider" android:authorities="com.example.csdn.MyProvider" android:exported="true" > </provider>
另一个app获取提供的数据:
通过getContentResolver();获取数据,然后使用正删改查进行操作。
import java.util.ArrayList; import java.util.List; import android.net.Uri; import android.os.Bundle; import android.app.Activity; import android.content.ContentResolver; import android.content.ContentValues; import android.database.Cursor; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; public class MainActivity extends Activity implements OnClickListener { private Button mBtn_insert; private Button mbtn_delete; private Button mBtn_update; private Button mBtn_query; private ContentResolver resovler; private ListView mLv; private Uri uri; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 字符串类型的uri 转成Uri类型 String uriStr = "content://com.example.csdn.MyProvider/Student"; uri = Uri.parse(uriStr); // 获取resolver的实例 resovler = getContentResolver(); initView(); } public void initView() { mBtn_insert = (Button) findViewById(R.id.mBtn_insert); mBtn_delete=(Button) findViewById(R.id.mBtn_delete); mBtn_update=(Button) findViewById(R.id.mBtn_update); mBtn_query = (Button) findViewById(R.id.mBtn_query); mLv = (ListView) findViewById(R.id.lv); mBtn_insert.setOnClickListener(this); mBtn_delete.setOnClickListener(this); mBtn_update.setOnClickListener(this); mBtn_query.setOnClickListener(this); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.mBtn_insert: ContentValues values = new ContentValues(); values.put("name", "杰哥"); values.put("age", "26"); resovler.insert(uri, values); break; case R.id.mBtn_delete: resovler.delete(uri, "name=?", new String[]{"杰哥"}); break; case R.id.mBtn_update: ContentValues contentValues=new ContentValues(); contentValues.put("name","颖宝"); contentValues.put("age",20); resovler.update(uri, contentValues, "name=?", new String[]{"杰哥"}); break; case R.id.mBtn_query: List<String> list = new ArrayList<String>(); Cursor cursor = resovler.query(uri, null, null, null, null); while (cursor.moveToNext()) { int nameIndex = cursor.getColumnIndex("name"); int ageIndex = cursor.getColumnIndex("age"); String nameStr = cursor.getString(nameIndex); String ageStr = cursor.getString(ageIndex); list.add(nameStr + ageStr); } ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list); lv.setAdapter(adapter); break; } } }
这个是xml布局:
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:id="@+id/mBtn_insert" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="增加" /> <Button android:id="@+id/mbtn_delete" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="删除" /> <Button android:id="@+id/mBtn_update" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="修改" /> <Button android:id="@+id/mBtn_query" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="查询" /> </LinearLayout> <ListView android:id="@+id/mLv" android:layout_width="match_parent" android:layout_height="wrap_content" />