您的位置:首页 > 移动开发 > Android开发

Android——使用ContentProvider在应用间传递数据

2015-11-12 15:03 471 查看
在学习了如何使用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;

大功告成,运行效果 :

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: