在学习了如何使用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;

大功告成,运行效果 :

更多相关文章

  1. 一句话锁定MySQL数据占用元凶
  2. Android(安卓)Selector用法小记
  3. Android入门笔记 - 网络通信 - HttpClient
  4. Android异常汇集----4. Android(安卓)requires compiler complia
  5. git的使用(上传项目到github)
  6. 第四章 Android开发三大基石—Activity、Service和Handler(2)
  7. Android(安卓)应用程序退出的四种方法
  8. Pro Android学习笔记(五):了解Content Provider(上)
  9. 查看Android系统内存使用的方法

随机推荐

  1. Android(安卓)Studio进行APP图标更改的两
  2. 发送和拦截短信
  3. [Google Android] GCM: Getting Started
  4. 整理文:Android设备唯一码
  5. Android:这是一份全面&详细的 热修复 学习
  6. Xutils3.0的cookie设置
  7. android 背景边框变圆角的几种方法
  8. android Splash闪屏的实现
  9. Android_文档学习_UI_creating menus
  10. eclipse创建2dx项目