Android的数据存储有五种办法Shared Preferences、网络存储、文件存储、外储存储、SQLite,一般这些存储都只是在独自的一个应用程序之中到达一个数据的同享,有时分咱们需求操作其他应用程序的一些数据,例如常见体系里的通讯录,短信,相片等等,所以云存储,通讯录,艳照门等等就孕育而生了。ContentProvider能够了解成内容供给者,也能够了解为一个接口,便是供给了一个供外部拜访的接口,有的时分需求进行权限操控。
ContentProvider简介
ContentProvider向咱们供给了咱们在应用程序之前同享数据的一种机制,而咱们知道每一个应用程序都是运行在不同的应用程序的,不同程序的之间数据同享是实际的需求,程序总不能使闭环的,Android中的ContentProvider外同享数据的优点是一致了数据的拜访办法。简略总结说下:
ContentProvider为存储和获取数据供给了一致的接口。ContentProvide对数据进行封装,不必关怀数据存储的细节。运用表的方式来安排数据。
运用ContentProvider能够在不同的应用程序之间同享数据。
Android为常见的一些数据供给了默许的ContentProvider(包含音频、视频、图片和通讯录等)。
说到了ContentProvider这么多优点,不能不说下Uri(Universal Resource Identifier)留意不是URL,通用资源标识符,看个简略的读取联系人的Uri,content://contacts/people,
content://是前缀,固定的;
contacts 主机名(或叫Authority)用于仅有标识这个ContentProvider,外部调用者能够依据这个标识来调用;
people 途径(path)表明咱们要操作的数据,途径的构建依据事务而定;
自界说ContentProvider
俗话说,欲善其事必先利其器,想要成为一个内容供给者,就先需求有数据,先树立一个SqlDbConncetion:
public class SqlDBConnection extends SQLiteOpenHelper {
private static final String DbName =Book.db;
private static int version=1;
public SqlDBConnection(Context context) {
super(context, DbName, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
String sqlString=create table Book (id integer primary key autoincrement,Name nvarchar(200),Title nvarchar(200));
db.execSQL(sqlString);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
上篇文章讲的junit测验这个时分能够拿过来运用一下初始化下数据:
public class BookCase extends AndroidTestCase {
public void Intial() {
SqlDBConnection dbConnection = new SqlDBConnection(getContext());
SQLiteDatabase sqlDataBase = dbConnection.getWritableDatabase();
long row = 0;
for (int i = 0; i 5; i++) {
ContentValues values = new ContentValues();
values.put(Name, 书本+i);
values.put(Title, 标题 + i);
row = sqlDataBase.insert(Book, null, values);
Log.i(BookCase, 刺进成功: + row);
}
}
}
前面是根底作业,这个时分就能够树立一个自己的ContentProvider:
+ View Code
主机名是需求自己去AndroidManifest.xml文件中自己装备的,要求是仅有的,最好是用包名就好:
android:authorities=com.example.googlecontentprovider.MyContentProvider>
假如觉得上面的那一串代码不是很好了解,下面调用的时分我会别离解说。
ContentResolver的运用
办法写在一个应用程序中调用归于正常,在别的一个程序中调用该程序的办法便是类似于接口了,下面先看本来初始化的数据:
从头新建一个Android测验项目,界说为BookCase,首要刺进数据,界说一个Uri,这里边主机名便是上面界说的包名,book/insert与CONTENT_INSERT是对应的:
public void bookInsert() {
Uri uri = Uri
.parse(content://com.example.googlecontentprovider.MyContentProvider/book/insert);
ContentResolver resolver = getContext().getContentResolver();
ContentValues values = new ContentValues();
values.put(Name, 书本5);
values.put(Title, 标题5);
uri = resolver.insert(uri, values);
Log.i(BookCase, Uri + uri);
long id = ContentUris.parseId(uri);
Log.i(BookCase, 测验成功 + id);
}
显现成果如下:
然后更新方才刺进的数据,相同的更具Code给Uri赋值,然后初始化一个ContentResolver,调用update办法:
public void bookUpdate() {
Uri uri = Uri
.parse(content://com.example.googlecontentprovider.MyContentProvider/book/update);
ContentResolver resolver = getContext().getContentResolver();
ContentValues values=new ContentValues();
values.put(Name, 修正);
int count = resolver.update(uri, values, id=?,new String[]{10});
Log.i(BookCase, 更新了 + count + 行);
删去刺进的数据:
public void bookDelete() {