当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。ContentProvider为存储和获取数据提供了统一的接口
注意: android:exported="true"
这个属性不是限制把服务暴露给其他应用程序的唯一方法。还可以使用权限来限制能够跟该服务交互的外部实体
在需要提供的应用程序AndroidManifest.xml文件章添加如下文件
1 2 3 4 5 6 <!-- 配置内容提供者,android:authorities为该内容提供者取名作为在本应用中的唯一标识 --> < provider android:name = "com.example.usersqllite.provider.UserProvider" android:authorities = "com.sanya.user.provider" android:exported = "true" > </ provider >内容提供者需要的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 package com.example.usersqllite.provider; import android.content.ContentProvider; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import com.example.usersqllite.domain.UserSqlLiteHelp; public class UserProvider extends ContentProvider { private static final int QUERY = 1 ; private static final int INSERT = 2 ; private static final int DELETE = 3 ; private static final int UPDATE = 4 ; private SQLiteDatabase database; // 创建uri匹配器 private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); static { // 建立 匹配规则 matcher.addURI( "com.sanya.user.provider" , "query" , QUERY); matcher.addURI( "com.sanya.user.provider" , "insert" , INSERT); matcher.addURI( "com.sanya.user.provider" , "delete" , DELETE); matcher.addURI( "com.sanya.user.provider" , "update" , UPDATE); } @Override public boolean onCreate() { UserSqlLiteHelp help = new UserSqlLiteHelp(getContext()); database = help.getWritableDatabase(); return true ; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { int match = matcher.match(uri); if (match == QUERY) { // 查询处理 UserSqlLiteHelp userSqlLiteHelp = new UserSqlLiteHelp(getContext()); SQLiteDatabase readableDatabase = userSqlLiteHelp .getReadableDatabase(); return readableDatabase.query( "user" , new String[] { "id" , "name" , "age" }, null , null , null , null , null ); } else { throw new RuntimeException( "查询出错,路径不能被识别" ); } } @Override public String getType(Uri uri) { return null ; } @Override public Uri insert(Uri uri, ContentValues values) { int match = matcher.match(uri); if (match == INSERT) { database.insert( "user" , null , values); } else { throw new RuntimeException( "插入数据出错,路径不能被识别" ); } return null ; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { int match = matcher.match(uri); if (match == DELETE) { database.delete( "user" , selection, selectionArgs); } else { throw new RuntimeException( "删除数据出错,路径不能被识别" ); } return 0 ; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { int match = matcher.match(uri); if (match == UPDATE) { database.update( "user" , values, selection, selectionArgs); } else { throw new RuntimeException( "更新数据出错,路径不能被识别" ); } return 0 ; } }其他应用程序调用的测试代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 public void query(View view) { ContentResolver resolver = getContentResolver(); Uri uri = Uri.parse( "content://com.sanya.user.provider/query" ); Cursor cursor = resolver.query(uri, null , null , null , null ); while (cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndex( "id" )); String name = cursor.getString(cursor.getColumnIndex( "name" )); int age = cursor.getInt(cursor.getColumnIndex( "age" )); System.out.println(id + "--" + name + "---" + age); } cursor.close(); } public void delete(View view) { ContentResolver resolver = getContentResolver(); Uri uri = Uri.parse( "content://com.sanya.user.provider/delete" ); resolver.delete(uri, "name=?" , new String[] { "哈哈" }); } public void update(View view) { ContentResolver resolver = getContentResolver(); Uri uri = Uri.parse( "content://com.sanya.user.provider/update" ); ContentValues values = new ContentValues(); values.put( "name" , "嘿嘿" ); values.put( "age" , 19 ); resolver.update(uri, values, "name=?" , new String[] { "三亚" }); } public void insert(View view) { ContentResolver resolver = getContentResolver(); Uri uri = Uri.parse( "content://com.sanya.user.provider/insert" ); ContentValues values = new ContentValues(); values.put( "name" , "大哥" ); values.put( "age" , 100 ); resolver.insert(uri, values); }
转载于:https://www.cnblogs.com/feelbest/p/3696250.html
相关资源:Android内容提供者ContentProvider用法实例分析