Content Provider实现跨程序数据共享
来源:互联网 发布:照片添加文字软件 编辑:程序博客网 时间:2024/06/04 19:04
自定义Content Provider
- 本次项目代码在实践–升级数据库最佳写法这篇博客的基础上增加的。
- 需要自定义Content Provider的代码如下:
public class MyDatabaseProvider extends ContentProvider { public static final int BOOK_DIR=0; public static final int BOOK_ITEM=1; public static final int H_DIR=2; public static final int H_ITEM=3; public static final String PATH="com.lingzhuo.testdatabase.provider"; private MyDatabaseHelper myDatabaseHelper; private static UriMatcher uriMatcher; static { uriMatcher=new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI(PATH,"book",BOOK_DIR); uriMatcher.addURI(PATH,"book/#",BOOK_ITEM); uriMatcher.addURI(PATH,"helloword",H_DIR); uriMatcher.addURI(PATH,"helloword/#",H_ITEM); } @Override public boolean onCreate() { myDatabaseHelper=new MyDatabaseHelper(getContext(),"school.db",null,2); return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteDatabase db=myDatabaseHelper.getWritableDatabase(); Cursor cursor=null; switch (uriMatcher.match(uri)){ case BOOK_DIR: cursor=db.query("book",projection,selection,selectionArgs,null,null,sortOrder); break; case BOOK_ITEM: String bookid= uri.getPathSegments().get(1); cursor=db.query("book",projection,"id=?",new String[]{bookid},null,null,sortOrder); break; case H_DIR: cursor=db.query("helloword",projection,selection,selectionArgs,null,null,sortOrder); break; case H_ITEM: String helloid= uri.getPathSegments().get(1); cursor=db.query("helloword",projection,"id=?",new String[]{helloid},null,null,sortOrder); break; } return cursor; } @Override public Uri insert(Uri uri, ContentValues values) { SQLiteDatabase db=myDatabaseHelper.getWritableDatabase(); Uri uriReturn=null; switch (uriMatcher.match(uri)){ case BOOK_DIR: case BOOK_ITEM: long newBookId=db.insert("book",null,values); uriReturn=Uri.parse("content://"+PATH+"/book/"+newBookId); break; case H_DIR: case H_ITEM: long newHId=db.insert("helloword",null,values); uriReturn=Uri.parse("content://"+PATH+"/helloword/"+newHId); break; } return uriReturn; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { SQLiteDatabase db=myDatabaseHelper.getWritableDatabase(); int deleteRows=0; switch (uriMatcher.match(uri)){ case BOOK_DIR: deleteRows=db.delete("book",selection,selectionArgs); break; case BOOK_ITEM: String bookid=uri.getPathSegments().get(1); deleteRows=db.delete("book","id=?",new String[]{bookid}); break; case H_DIR: deleteRows=db.delete("helloword",selection,selectionArgs); break; case H_ITEM: String hid=uri.getPathSegments().get(1); deleteRows=db.delete("helloword","id=?",new String[]{hid}); break; } return deleteRows; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { SQLiteDatabase db=myDatabaseHelper.getWritableDatabase(); int updateRows=0; switch (uriMatcher.match(uri)){ case BOOK_DIR: updateRows=db.update("book",values,selection,selectionArgs); break; case BOOK_ITEM: String bookid=uri.getPathSegments().get(1); updateRows=db.update("book",values,"id = ?",new String[]{bookid}); break; case H_DIR: updateRows=db.update("helloword",values,selection,selectionArgs); break; case H_ITEM: String hid=uri.getPathSegments().get(1); updateRows=db.update("helloword",values,"id=?",new String[]{hid}); break; } return updateRows; } @Override public String getType(Uri uri) { switch (uriMatcher.match(uri)){ case BOOK_DIR: return "vnd.android.cursor.dir/vnd.com.lingzhuo.testdatabase.provider.book"; case BOOK_ITEM: return "vnd.android.cursor.item/vnd.com.lingzhuo.testdatabase.provider.book"; case H_DIR: return "vnd.android.cursor.dir/vnd.com.lingzhuo.testdatabase.provider.helloword"; case H_ITEM: return "vnd.android.cursor.item/vnd.com.lingzhuo.testdatabase.provider.helloword"; } return null; }}
- Uri对象的getPathSegments()方法,它会将内容URI权限之后的部分以“/”符号进行分割,并把分割后的结果放入到一个字符串列表中,那这个列表的0个位置和1个位置存放的就分别是路径和id了。得到id之后,就可以进行约束查询了。
String hid=uri.getPathSegments().get(1);
- onCreate(),初始化内容时调用,返回true表示初始化成功,false表示失败
- query(),添加数据的方法,添加完成后,返回一个用于表示这条新记录的URI。
- update(),更新数据的方法,返回值就是更新数据受影响的行数
- delete(),删除数据的方法,返回值就是删除数据受影响的行数
getType(),根据传入的内容URI来返回相应的MIME类型。
getType()的返回值要求:
(1)必须以vnd开头
(2)如果内容以URI路径结尾,则后接android.cursor.dir/,如果内容URI以id结尾,则后接android.cursor.item/
(3)最后接上vnd.包名./provider.表名- 对于content://com.lingzhuo.testdatabase/provider/book内容URI
- vnd.android.cursor.dir/vnd.com.lingzhuo.testdatabase/provider.book
- 对于content://com.lingzhuo.testdatabase/provider/book/1内容URI
- vnd.android.cursor.item/vnd.com.lingzhuo.testdatabase/provider.book
private static UriMatcher uriMatcher; static { uriMatcher=new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI(PATH,"book",BOOK_DIR); uriMatcher.addURI(PATH,"book/#",BOOK_ITEM); uriMatcher.addURI(PATH,"helloword",H_DIR); uriMatcher.addURI(PATH,"helloword/#",H_ITEM); }
- 我们借助UriMatcher这个类可以轻松的实现匹配内容URI的功能。
- UriMatcher提供一个addURI(),这个方法接受三个参数
- 第一个参数权限
- 第二个参数路径
- 第三个参数自定义的代码
- 将这些代码静态代码块,就可以先执行了
@Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { switch (uriMatcher.match(uri)){ case case BOOK_DIR: //查询book表中的所有数据 break; case BOOK_ITEM: //查询book表中的单条数据 break; case H_DIR: //查询helloword表中的所有数据 break; case H_ITEM: //查询helloword表中的单条数据 break; } return null; }
- 通过这样的判断语句就可以判断出要访问哪一张表,从而进行操作
- 以此类推,其余的方法,执行操作的时候,都可以这样判断一下
另建项目测试
- 简单布局,增删改查
<?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:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.lingzhuo.testprovider2.MainActivity"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="增" android:id="@+id/button_add" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="删" android:id="@+id/button_delete" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="改" android:id="@+id/button_change" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="查" android:id="@+id/button_search" /></LinearLayout>
- 逻辑代码
public class MainActivity extends AppCompatActivity implements View.OnClickListener{ private Button button_add,button_delete,button_change,button_search; private String newId; private Uri uri; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init() { button_add= (Button) findViewById(R.id.button_add); button_change= (Button) findViewById(R.id.button_change); button_delete= (Button) findViewById(R.id.button_delete); button_search= (Button) findViewById(R.id.button_search); button_add.setOnClickListener(this); button_search.setOnClickListener(this); button_delete.setOnClickListener(this); button_change.setOnClickListener(this); uri=Uri.parse("content://com.lingzhuo.testdatabase.provider/book"); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.button_add: ContentValues values=new ContentValues(); values.put("name","Jack"); values.put("age","10086"); values.put("clazz","968574"); Uri newUri=getContentResolver().insert(uri,values); newId=newUri.getPathSegments().get(1); Log.d("**************id",newId); break; case R.id.button_delete: Uri uri_delete=Uri.parse("content://com.lingzhuo.testdatabase.provider/book/"+newId); getContentResolver().delete(uri_delete,null,null); break; case R.id.button_change: Uri uri_change=Uri.parse("content://com.lingzhuo.testdatabase.provider/book/"+newId); ContentValues values2=new ContentValues(); values2.put("name","aaaaaaaaaaaa"); values2.put("age","86001"); values2.put("clazz","135426"); getContentResolver().update(uri_change,values2,null,null); break; case R.id.button_search: Cursor cursor=getContentResolver().query(uri,null,null,null,null); if (cursor!=null){ while(cursor.moveToNext()){ String name=cursor.getString(cursor.getColumnIndex("name")); int age=cursor.getInt(cursor.getColumnIndex("age")); String clazz=cursor.getString(cursor.getColumnIndex("clazz")); Toast.makeText(MainActivity.this, name + age + clazz, Toast.LENGTH_SHORT).show(); Log.d("**************",name+age+clazz); } } break; } }}
- 效果图如下:
0 0
- Content Provider实现跨程序数据共享
- 内容提供器(Content Provider)--跨程序共享数据
- 内容提供者(Content Provider)--跨程序共享数据
- 第一行代码笔记 跨程序共享数据 content provider
- content provider程序间数据共享
- Content Provider实现跨应用数据库共享
- Android:Content Provider数据共享
- Content Provider数据共享机制
- 安卓跨程序共享数据:内容提供器Content Provider
- Android从入门到精通第11章:Content Provider实现数据共享
- Android系统数据共享---Content Provider学习小结
- android的content provider之一:SharedPreferences && 进程数据共享方法
- android数据共享之Content Provider(概念篇)
- android数据共享之Content Provider(访问篇CRUD)
- android 学习笔记(8)content provider共享数据
- Android Content Provider的共享数据更新通知机制分析
- 采用Content Provider(内容提供者)对外共享数据
- 【Android学习笔记】用于共享数据的Content Provider
- ConcurrentHashMap使用示例
- swift语言使用正则表达式验证字符串是否为邮箱,手机号,身份证号
- java基础
- 设计模式-单例模式
- JavaScript 闭包、即时执行等
- Content Provider实现跨程序数据共享
- PCA的数学原理(非常值得阅读)!!!!
- webstorm安装adb和ionic插件
- Servlet请求多线程访问
- Linux内核分析(二)之简单的进程调度
- 桶排序(BucketSort)
- android 代码连接 wifi
- linux下编译使用lua及cjson
- poj-1285 Combinations, Once Again(DP)