在学习了如何使用SQLite存储数据之后,接着我们要学习使用ContentProvider在应用之间传递数据库的内容
首先我们要创建一个MyProvider 类然他继承自 ContentProvider 这个类,并重写父类的几个方法:
@Override
public boolean onCreate() {
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
return null;
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
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;
}
由于我们要操作的是SQLite数据库,所以我们定义一亿个全局的SQLiteDatabase,在oncreate方法中初始化、
//全局字段
private SQLiteDatabase database;
。。。。。。。。。。。。。
//在onCreate方法中初始化
database=getContentResolver().openOrCreateDatabase("db",MODE_PRIVATE,null);//用此方法打开或者创建一个数据库(名称,模式,数据库游标SQLiteDatabase.CursorFactory)
database.execSQL("create table tab(_id integer primary key autoincrement,name text)");//创建表
然后重写query()函数和insert()//其他操作类似
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
return database.query("tab",null,null,null,null,null,null);
}
@Override
public Uri insert(Uri uri, ContentValues values) {
database.insert("tab","_id",values);
return uri;
}
注意这个时候我们虽然完成了MyProvider.java文件的工作,但是别忘了
在Androidmainfest.xml中注册provider,在application下面加上
<provider
android:authorities="com.sky.cp2"
android:name=".MyProvider"
android:exported="true"/>
authorities必填:命名以包名+ContentProvider名
!若果你想让其他的应用程序访问该数据,请务必加上exported=”true”
!若果你想让其他的应用程序访问该数据,请务必加上exported=”true”
!若果你想让其他的应用程序访问该数据,请务必加上exported=”true”
好了这个时候在MainActivity中的onCreate中插入一条数据
首先我们要新建一条数据
ContentValues cv=new ContentValues();
cv.add("name","C#");
然后调用此方法getContentResolver().insert方法
public final @Nullable Uri insert(@NonNull Uri url, @Nullable ContentValues values)
需要两个参数Uri和values,
注意到了之前在AndroidManifest.xml我们注册时的一个字段了没:
authorities=”com.sky.cp2”;
这里.
Uri uri=Uri.parse("content://com.sky.cp2");
!不要忘了加上刚content://
!不要忘了加上刚content://
!不要忘了加上刚content://
然后调用:
getContentResolver().insert(uri,cv);
这样插入就完成了,如果用的是模拟器,可以再DMMS中模拟器的data/data目录自己的工程文件下发现多了一项(用的是真机看不到,不知道是不是权限的问题)
接着我们在另外一个应用下来读取刚刚上面的应用存的数据(前提是上一个应用已经安装和运行)
新建一个Module:ContentWriter
在启动Activity的布局文件里加上一个ListView,id就设置为lv,在Activity.java中的onCreate中找到lv,
好了开始获取上面的应用的数据;
public final Cursor query( Uri uri, String[] projection,
String selection, String[] selectionArgs,
String sortOrder)
Uri 就是我们在上一个应用中用的Uri
projection是我们要查询的列,null:表示所有列
selection 我们自己的查询条件,null:表示无条件
selectionArgs 查询条件中的参数,null:无参数
order是我们想要的排序方式,null:默认参数
所以
Uri uri=Uri.parse("content://com.sky.cp2");
Cursor c=getContentResolver().query(uri,null,null,null,null);
Cursor 应该熟悉了,是一个数据表的游标对象,利用它可以构建一个简单的Adapter
SimpleCursorAdapter adapter=new SimpleCursorAdapter(this,R.layout.list_cell,c,new String[]{"name"},new int[]{R.id.tvName});
参数依次为
Context context: 当前的context;
int layoutRes: Adapter 的item的layout
Cursor cursor:上面获得的c
String[] from:数据中的字段名数组
int[] to:要显示到item布局文件上的控件Id
上面忘记说了,在MainActivity中的布局文件activity_main.xml文件中要有一个TextView,id 为tvName;