内部利用contentProvider暴露接口供外部查询删除操作,外部查询删除使用contentResolver,首先使用sqlite创建一个数据库表student,然后使用contentProvider暴露数据,在另一个modle里使用contentResolver解析数据,contentProvider底层是通过Binder实现的

public class MainActivity extends AppCompatActivity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//contentprovider不用在此创建对象,只要在配置文件里声明就可以执行.输出"创建"证明创建成功,创建只有一次,第二次不会执行oncreate
//方法,可以在data/data/包名,中找到数据库文件,删除就会重新创建并执行oncreate方法 }
}

上面是主activity

public class Mysqlite extends SQLiteOpenHelper {
SQLiteDatabase readableDatabase;
public Mysqlite(Context context) {
super(context, "student", null, 2);
readableDatabase = getWritableDatabase();//创建数据库不需要什么权限,但是这行代码一定要写
} @Override
public void onCreate(SQLiteDatabase db) { db.execSQL("create table student (id integer,name varchar)");
System.out.println("创建");
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }
}

上面是创建数据库

public class MyContentProvider extends ContentProvider {
Mysqlite mysqlite;
SQLiteDatabase sqLiteDatabase; private static final UriMatcher uriMatcher;//一定也要静态的才行 static{
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI("com.january.summer", "student", 0);//表的第一行
uriMatcher.addURI("com.january.summer", "student", 1);
uriMatcher.addURI("com.january.summer", "student", 2);
}
public MyContentProvider() { } @Override
public int delete(Uri uri, String selection, String[] selectionArgs) { int deleteInt = 0;
deleteInt = sqLiteDatabase.delete("student", selection, selectionArgs); //参数1:表名 参数2:约束删除列的名字 参数3:具体行的值
switch (uriMatcher.match(uri)) {
case 0:
deleteInt = sqLiteDatabase.delete("student", selection, selectionArgs);
System.out.println("删除第一行");
break;case 1:
String deleteId = uri.getPathSegments().get(1);
deleteInt = sqLiteDatabase.delete("student", "id=?", new String[]{deleteId});
System.out.println("删除第二行");
break;
case 2:
sqLiteDatabase.delete("student", selection, selectionArgs);
System.out.println("删除第三行");
break;
}
return deleteInt; } @Override
public String getType(Uri uri) {
return null;
} @Override
public Uri insert(Uri uri, ContentValues values) {
sqLiteDatabase.insert("student", null, values);
getContext().getContentResolver().notifyChange(uri, null);
return uri; } @Override
public boolean onCreate() {
mysqlite = new Mysqlite(getContext());
sqLiteDatabase = mysqlite.getWritableDatabase(); return true;
} @Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) { return sqLiteDatabase.query("student", projection, selection, selectionArgs, null, null, null);
//必须自己实现查询功能,外部程序才可以查询
} @Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) { return 0;
}
}

上面是contentProvider

  <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<provider
android:name=".MyContentProvider"
android:authorities="com.january.summer"
android:enabled="true"
android:exported="true"></provider> <activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

上面是配置文件//

/////////////

public class MainActivity extends AppCompatActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Uri uri = Uri.parse("content://com.january.summer/student"); ContentValues contentValues = new ContentValues();
contentValues.put("name", "小明");
getContentResolver().insert(uri, contentValues); Cursor bookCursor = getContentResolver().query(uri, new String[]{"id", "name"}, null, null, null);
int count = bookCursor.getCount();
System.out.println("行数"+count); getContentResolver().delete(uri, "name=?", new String[]{"小明"}); if (bookCursor != null) {
bookCursor.moveToFirst();
while (bookCursor.moveToNext()) {
System.out.println("ID:" + bookCursor.getInt(bookCursor.getColumnIndex("id"))
+ " name:" + bookCursor.getString(bookCursor.getColumnIndex("name")));
}
bookCursor.close();
} }
}

上面是另一个modle的主activity,每运行一次插入一条数据,插入后游标不一定在第一行,movetofirst让游标移动到第一行前面,此时没有数据,movetonext才到第一行.可以用debug测试看的更清楚

使用contentProvider的更多相关文章

  1. Android之ContentProvider数据存储

    一.ContentProvider保存数据介绍 一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据完全暴露出去,而且ContentProvider是以类似数据库中表的方式将数 ...

  2. Xamarin.Android之ContentProvider

    一.前言 掌握了如何使用SQLiteOpenHelper之后,我们就可以进行下一步的学习.本章我们将会学习如何使用ContentProvider来将数据库方面的操作封装起来,同时它还可以供其他应用访问 ...

  3. ContentProvider域名替换小工具

    开发项目域名想怎么换就怎么换,就是这么任性! 这是一个很有意思的小工具! 这是一个方便开发人员和测试人员的小工具!! 吐槽: 一直在做Android开发,一直总有一个问题存在:做自己公司的apk开发时 ...

  4. Android开发学习—— ContentProvider内容提供者

    * 应用的数据库是不允许其他应用访问的* 内容提供者的作用就是让别的应用访问到你的数据库.把私有数据暴露给其他应用,通常,是把私有数据库的数据暴露给其他应用. Uri:包含一个具有一定格式的字符串的对 ...

  5. 简单的学习心得:网易云课堂Android开发第六章SQLite与ContentProvider

    一.SQLite 1.基本操作: (1)创建数据库:在SQLiteOpenHelper的子类构造器中创建. (2)创建表:在SQLiteOpenHelper的子类onCreate方法中,调用execS ...

  6. ContentProvider中央档案馆,以及获取联系人电话的示例

    Android官方文档介绍的数据存储方式共有五种,sqlite,SharedPreferences,网络存储,外储存储,文件存储,但是这些数据都无法进行共享,那么我们就引入了今天的主角:Content ...

  7. Android基础 : Android ContentProvider

    Android 应用程序通过ContentProvider实现方式统一的数据共享功能. 外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据,在Activi ...

  8. 安卓初級教程(3):ContentProvider的運用原理

    package com.example.android.provider; import java.util.ArrayList; import java.util.HashMap; import j ...

  9. Android探索之ContentProvider熟悉而又陌生的组件

    前言: 总结这篇文章之前我们先来回顾一下Android Sqlite数据库,参考文章:http://www.cnblogs.com/whoislcj/p/5506294.html,Android程序内 ...

  10. 四大组件之ContentProvider

    前言 ContentProvider作为Android的四大组件之一,是属于需要掌握的基础知识,可能在我们的应用中,对于Activity和Service这两个组件用的很常见,了解的也很多,但是对Con ...

随机推荐

  1. Docker:一、开始部署第一个Asp.net应用

    工具: docker desktop :一个使用Docker的IDE工具,可以理解为SourceTree,也是使用git的一个桌面化工具: kitematic :配合desctop,用来管理本地的镜像 ...

  2. Java中的常见锁(公平和非公平锁、可重入锁和不可重入锁、自旋锁、独占锁和共享锁)

    公平和非公平锁 公平锁:是指多个线程按照申请的顺序来获取值.在并发环境中,每一个线程在获取锁时会先查看此锁维护的等待队列,如果为空,或者当前线程是等待队列的第一个就占有锁,否者就会加入到等待队列中,以 ...

  3. Java Web学习(八)RESTful设计

    一.RESTful设计风格 REST :指的是一组架构约束条件和原则. RESTful :满足这些约束条件和原则的应用程序或设计就是 . REST 原则 客户端和服务器之间的交互在请求之间是无状态的. ...

  4. Java源码赏析(五)再识 String 类

    在 Java源码赏析(三)初识 String 类   中,我们已经大概理解了String的接口,接下来我们描述一下String的常用工具方法. /** * 为了精简的String结构,之前提到的方法省 ...

  5. MGRE及实验

    tunnel 隧道:一种的简单的VPN技术: 普通的tunnel为点到点网络类型: 生成隧道接口,流量通过路由查询后,若通过隧道接口转发时,需要在原有的三层报头前,再添加一个公有地址间的报头: 将两个 ...

  6. django 的基础设计

    一.web程序工作流程 二.django  的基础介绍 目的:了解Django框架的作用和特点 作用: 简便.快速的开发数据库驱动的网站 Django的优势 快速开发 MVT 功能齐全 Django学 ...

  7. 03 sublime text3下配置Java的编译运行环境

    参考如下文章,加入了自己的干货: https://blog.csdn.net/qq_38295511/article/details/81140069 https://blog.csdn.net/qq ...

  8. 固件(Firmware)

    来源:https://baike.baidu.com/item/%E5%9B%BA%E4%BB%B6/627829 固件   固件(Firmware)就是写入EPROM(可擦写可编程只读存储器)或EE ...

  9. 1个LED的亮度自动控制

    控制任务和要求 通过程序控制LED的亮度按照要求变化 电路设计  程序设计 1 int bright_number = 0; //此变量用来表示LED的亮度 2 int bright_gap = 5; ...

  10. 2. 在TCGA中找到并下载意向数据

    听说过别人用生信分析"空手套白狼"的故事吧想做吗好想学哦~ 或多或少都知道GEO和TCGA这些公共数据库吧!那么你知道怎么在数据库上找到意向数据,并且成功下载呢?这第一步要难倒一大 ...