内部利用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. 使用PyCharm引入需要使用的包

    在学习python的时候,被推荐了使用PyCharm这款IDE,但是经常在已经pip安装第三方包的时候import包的时候却发生了问题- -无法引入. 进行模块的加载,百度之后,了解到,在这款IDE中 ...

  2. defer 延迟调用

    1. 延迟调用 defer 的用法很简单,只要在后面跟一个函数的调用,就能实现将这个  xxx 函数的调用延迟到当前函数执行完后再执行. defer xxx()   这是一个很简单的例子,可以很快帮助 ...

  3. python爬取虎牙直播颜值区美女主播照片

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...

  4. Oracle学习(十五)PLSQL安装

    PS:由于原来一直用的旧版本的PLSQL客户端,查看执行计划有些数据无法展示,所以今天换一波新版本的使用,记录下安装和使用流程. PLSQL(oracle数据可视化工具) 一.下载 我用的13的版本, ...

  5. 刷题[HFCTF2020]EasyLogin

    前置知识 node.js koa框架常用目录,文件 js弱类型语言,空数组与整数1比较时,返回turue jwt令牌 博客讲解: 关于jwt的讲解: http://www.ruanyifeng.com ...

  6. Android App 侧边栏菜单的简单实现

    效果图 Layout 注意事项 想要实现侧边栏,需要配合使用DrawerLayout.因为会用到嵌套布局,所以根布局不能是 ConstraintLayout,最好使用 LinearLayout 布局. ...

  7. android.widget.TextView.setText() on a null object reference

    错误描述 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView. ...

  8. Centos-内核核心组成

    linux内核,相当于linux大脑,高可靠和高稳定都是针对内核来说 完整linux核心组成部分 1. 内存管理 合理有效的管理整个系统的物理内存,同时快速响应内核各子系统对内存分配的请求 2. 进程 ...

  9. Go-注释

    什么是注释? 注释是给开发人员看的,目的是降低开发人员阅读代码的时间成本和代码阅读困难程度 Go-注释内容 1. 包注释,位于某个包下Go程序文件的顶部 2. 函数注释,位于Go函数的头部 3. 代码 ...

  10. Book of Shaders 03 - 学习随机与噪声生成算法

    0x00 随机 我们不能预测天空中乌云的样子,因为它的纹理总是具有不可预测性.这种不可预测性叫做随机 (random). 在计算机图形学中,我们通常使用随机来模拟自然界中的噪声.如何获得一个随机值呢, ...