android——实现跨程序访问数据

使用之前的SQLite存储的应用程序。首先需要在这个应用程序中创建内容提供器,右击com.example.administrator.exp7包→New→Other→Content Provider,会弹出这样的对话框,

  其中Class name 是内容提供器的名字,Authorities是包名com.example.administrator.exp7,Exported表示是否允许外部程序访问内容提供器,Enabled表示是否启用这个内容提供器。

  然后修改MyContentProvider中的代码:

  1 public class MyContentProvider extends ContentProvider {
  2     //用于识别URI的自定义代码
  3     public static final int BOOK_DIR = 0;
  4
  5     public static final int BOOK_ITEM = 1;
  6
  7     public static final int CATEGORY_DIR = 2;
  8
  9     public static final int CATEGORY_ITEM = 3;
 10
 11     public static final String AUTHORITY = "com.example.administrator.exp7";
 12
 13     private MyDatabaseHelper dbHelper;
 14
 15     //创建UriMatcher的实例
 16     private static UriMatcher uriMatcher;
 17
 18     //将自定义代码和希望的URI匹配
 19     static {
 20         uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
 21         uriMatcher.addURI(AUTHORITY,"book",BOOK_DIR);
 22         uriMatcher.addURI(AUTHORITY,"book/#",BOOK_ITEM);
 23         uriMatcher.addURI(AUTHORITY,"category",CATEGORY_DIR);
 24         uriMatcher.addURI(AUTHORITY,"category/#",CATEGORY_ITEM);
 25
 26     }
 27     @Override
 28     /*
 29     初始化时调用
 30     通常会在这里完成对数据库的创建和升级等操作,返回true表示初始化成功。
 31     只有当存在ContentResolver尝试访问程序中的数据时,才会进行初始化。
 32      */
 33     public boolean onCreate() {
 34         dbHelper = new MyDatabaseHelper(getContext(), "BookStore.db", null , 2);
 35         return true;
 36     }
 37
 38     /*
 39     查询数据
 40     uri 确定查询的是那一张表
 41     projection 查询那一列
 42     selection 和 selectionArgs查询那些行
 43     sortOrder 对结果进行排序
 44     返回的数据存放在Cursor对象中
 45      */
 46     @Override
 47     public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
 48
 49         SQLiteDatabase db = dbHelper.getReadableDatabase();
 50         Cursor cursor = null;
 51
 52         //判断希望被访问的数据是什么数据
 53         switch (uriMatcher.match(uri)){
 54             case BOOK_DIR:
 55                 //查询table1表中的所有数据
 56                 cursor = db.query("Book",projection, selection, selectionArgs,null ,null,sortOrder);
 57                 break;
 58             case BOOK_ITEM:
 59                 //查询table1表中的单条数据
 60                 String bookId = uri.getPathSegments().get(1);
 61                 cursor = db.query("Book",projection, "id = ?", new String[] { bookId },null ,null,sortOrder);
 62                 break;
 63             case CATEGORY_DIR:
 64                 cursor = db.query("Category",projection, selection, selectionArgs,null ,null,sortOrder);
 65                 break;
 66             case CATEGORY_ITEM:
 67                 //查询table2表中的单条数据
 68                 String categoryId = uri.getPathSegments().get(1);
 69                 cursor = db.query("Category",projection, "id = ?", new String[] { categoryId },null ,null,sortOrder);
 70                 break;
 71             default:
 72                 break;
 73         }
 74         return cursor;
 75     }
 76
 77     /*
 78     根据传入的数据URI来返回相应的MIME类型
 79      */
 80     @Override
 81     public String getType(Uri uri) {
 82
 83         switch (uriMatcher.match(uri)){
 84             case BOOK_DIR:
 85                 return "vnd.android.cursor.dir/vnd.com.example.administrator.exp7.provider.book";
 86             case BOOK_ITEM:
 87                 return "vnd.android.cursor.item/vnd.com.example.administrator.exp7.provider.book";
 88             case CATEGORY_DIR:
 89                 return "vnd.android.cursor.dir/vnd.com.example.administrator.exp7.provider.category";
 90             case CATEGORY_ITEM:
 91                 return "vnd.android.cursor.item/vnd.com.example.administrator.exp7.provider.category";
 92             default:
 93                 break;
 94         }
 95         return null;
 96     }
 97     /*
 98     添加数据
 99     uri 确定添加的是那一张表
100     values 保存待添加的数据
101     返回一条表示这条新记录的URI
102      */
103     @Override
104     public Uri insert(Uri uri, ContentValues values) {
105
106         SQLiteDatabase db = dbHelper.getWritableDatabase();
107         Uri uriReturn = null;
108
109         //判断希望被增加的数据是那个表的
110         switch (uriMatcher.match(uri)){
111
112             case BOOK_DIR:
113             case BOOK_ITEM:
114                 long newBookId = db.insert("Book",null,values);
115                 uriReturn = Uri.parse("content://"+ AUTHORITY + "/book/" + newBookId);
116                 break;
117             case CATEGORY_DIR:
118             case CATEGORY_ITEM:
119                 long newCategoryId = db.insert("Category",null,values);
120                 uriReturn = Uri.parse("content://"+ AUTHORITY + "/category/" + newCategoryId);
121                 break;
122             default:
123                 break;
124         }
125         return uriReturn;
126     }
127     /*
128     删除数据
129     selection 和 selectionArgs 删除那些行
130     返回被删除的行数
131      */
132     @Override
133     public int delete(Uri uri, String selection, String[] selectionArgs) {
134         SQLiteDatabase db = dbHelper.getWritableDatabase();
135         int deletedRows = 0;
136
137         switch (uriMatcher.match(uri)){
138             case BOOK_DIR:
139                 deletedRows = db.delete("Book", selection, selectionArgs);
140                 break;
141             case BOOK_ITEM:
142                 String bookId = uri.getPathSegments().get(1);
143                 deletedRows = db.delete("Book",  "id = ?", new String[] { bookId });
144                 break;
145             case CATEGORY_DIR:
146                 deletedRows = db.delete("Category",selection, selectionArgs);
147                 break;
148             case CATEGORY_ITEM:
149                 String categoryId = uri.getPathSegments().get(1);
150                 deletedRows = db.delete("Category","id = ?", new String[] { categoryId });
151                 break;
152             default:
153                 break;
154         }
155         return deletedRows;
156     }
157     /*
158     更新已有的数据
159     uri 确定更新的是那一张表
160     values 新数据
161     selection 和 selectionArgs 更新那些行
162     会返回更新的行数
163      */
164     @Override
165     public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
166
167         SQLiteDatabase db = dbHelper.getWritableDatabase();
168         int updatedRows = 0;
169
170         switch (uriMatcher.match(uri)){
171
172             case BOOK_DIR:
173                 updatedRows = db.update("Book", values, selection, selectionArgs);
174                 break;
175             case BOOK_ITEM:
176                 String bookId = uri.getPathSegments().get(1);
177                 updatedRows = db.update("Book", values, "id = ?", new String[] { bookId });
178                 break;
179             case CATEGORY_DIR:
180                 updatedRows = db.update("Category", values, selection, selectionArgs);
181                 break;
182             case CATEGORY_ITEM:
183                 String categoryId = uri.getPathSegments().get(1);
184                 updatedRows = db.update("Category", values, "id = ?", new String[] { categoryId });
185                 break;
186             default:
187                 break;
188         }
189         return updatedRows;
190     }
191 }

  先看onCreate()方法完成了数据库的创建或升级,创建了一个MyDatabaseHelper 的实例dbHelper,并返回true。

  然后是用于查询的query函数,先通过dbHelper.getReadableDatabase()方法获得可以操作数据库的SQLiteDatabase 对象的实例db,根据传入的Uri判断希望被访问的数据是哪一张表,在调用SQLiteDatabase 的query()方法进行查询,这里还使用了uri.getPathSegments().get(1),这个方法会将内容URI权限后的部分以"/"进行分割,第一个"/"之前的可用get()

SQLiteDatabase

时间: 2024-10-19 13:14:57

android——实现跨程序访问数据的相关文章

Android 跨程序共享数据,探究内容提供器

内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性.目前,使用内容提供器是 Android 实现跨程序共享数据的标准方式. 不同于文件存储和 SharePreferences 存储中的两种全局可读写操作模式,内容提供器可以选择只对哪一部分数据进行共享,从而保证我们程序中的隐私数据不会有泄露的风险. 访问其他程序中的数据: 对于每一个应用程序来说,如果想要访问内容提

内容提供者(Content Provider)--跨程序共享数据

内容提供者简介 访问其他应用中的数据 ContentResolver 的基本用法 实例读取系统联系人 创建自己的内容提供器 创建内容提供器的步骤 创建新类继承ContentProvider并且重写其中6个方法 内容URI参数 使用UriMatcher实现匹配内容URI的功能 getType函数介绍 实现跨程序数据共享 内容提供者 访问自己创建的内容提供者数据 遇到的问题 内容提供者简介 使用场景: 比如:电话薄,短信,媒体库 简介 主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整

android: 实现跨程序数据共享

简单起见,我们还是在上一章中 DatabaseTest 项目的基础上继续开发,通过内容提供器 来给它加入外部访问接口. 打开 DatabaseTest 项目,首先将 MyDatabaseHelper 中使用 Toast 弹出创建数据库成功的提示去除掉,因为跨程序访问时我们不能直接使用 Toast.然后添加 一个 DatabaseProvider 类,代码如下所示: public class DatabaseProvider extends ContentProvider { public sta

使用vue-cli+axios配置代理进行跨域访问数据

1.首先在本地全局安装 vue-cli vue-cli网址:https://github.com/vuejs/vue-cli 先在控制台安装 全局vue-clis npm install -g vue-cli 2.初始化项目(vuecli 项目名称) vue init webpack vuecli //vuecli是项目名 也可以在空项目中输入 vue init webpack 将项目变为 vue-cli项目 3.在vuecli 项目中安装依赖文件 npm install 4.在vuecli 项

ADO.NET程序访问数据的组件

组成--数据集(内存中的数据库) --DataSet数据集 --DataTable数据表 --DataColumn数据列 --DataRow数据行 --DataView数据视图--NET数据提供程序 --Connection连接(程序和数据库之间的桥梁) --Open/Close --ConnectionString:连接字符串(目标数据库的信息) --服务器:server / data source --用户名:uid / user id --密码:pwd / password --数据库:d

设置IE浏览器跨域访问数据

在开发中,经常会遇到多站点跨域访问后台服务获取数据的情况,解决方法有两种 自己写代理服务,访问代理服务,代理服务请求服务获取数据再返回: 设置浏览器可以跨域访问数据. 本文来讲如何设置IE浏览器跨域访问数据,步骤如下: 打开[Internet选项],窗口如下 选择标签[安全],图片如下 选中[Internet],选择[自定义级别],图片如下:      如上图,在[其他]目录下,设置[跨域浏览窗口和框架]和[通过域访问数据源]为启用,确定,即设置成功! 如果站点为[本地intranet],则选择

跨程序共享数据

一.内容提供器 内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性. 内容提供器的用法一般有两种,一种是使用现有的内容提供器来读取和操作相应程序中的数据,另一种是创建自己的内容提供器给我们程序的数据提供外部访问接口. 二.ContentResolver 的基本用法 对于每一个应用程序来说,如果想要访问内容提供器中共享的数据,就一定要借助ContentResolve

内容提供者(Content Provider)——跨程序共享数据

内容提供者 Content Provider 应用的数据库是不允许其他应用访问的 内容提供者的作用就是让别的应用访问到你的数据库 自定义内容提供者,继承ContentProvider类,重写增删改查方法, 如果想要访问ContentProvider中的共享的数据,就一定要借助ContentResolver类 进行CRUD操作 insert() 添加数据 update() 更新数据 delete() 删除数据 query() 查询数据 getContentResolver().query(uri,

在Vue中如何使用axios跨域访问数据(转)

最近在项目中需要用到axios,所以就恶补一下这个axios到底是什么东东.越来它是vue-resource的替代品,官网也说了,以后都用axios, vue-resource不在维护.那么这个axios怎么用呢,上网搜索了一大堆,基本上都是雷同,我也不知道那些作者有没有在本地测试过.至少我按照网上的做法,总不能成功.经过几天的奋斗,我终于把它搞清楚了,为了不让其他的小伙伴们走弯路,我把我在实际操作中的例子分享给大家,希望对大家有用. 一.安装axios 老规矩,要想使用axios,我们得安装它