使用contentProvider
内部利用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的更多相关文章
- Android之ContentProvider数据存储
一.ContentProvider保存数据介绍 一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据完全暴露出去,而且ContentProvider是以类似数据库中表的方式将数 ...
- Xamarin.Android之ContentProvider
一.前言 掌握了如何使用SQLiteOpenHelper之后,我们就可以进行下一步的学习.本章我们将会学习如何使用ContentProvider来将数据库方面的操作封装起来,同时它还可以供其他应用访问 ...
- ContentProvider域名替换小工具
开发项目域名想怎么换就怎么换,就是这么任性! 这是一个很有意思的小工具! 这是一个方便开发人员和测试人员的小工具!! 吐槽: 一直在做Android开发,一直总有一个问题存在:做自己公司的apk开发时 ...
- Android开发学习—— ContentProvider内容提供者
* 应用的数据库是不允许其他应用访问的* 内容提供者的作用就是让别的应用访问到你的数据库.把私有数据暴露给其他应用,通常,是把私有数据库的数据暴露给其他应用. Uri:包含一个具有一定格式的字符串的对 ...
- 简单的学习心得:网易云课堂Android开发第六章SQLite与ContentProvider
一.SQLite 1.基本操作: (1)创建数据库:在SQLiteOpenHelper的子类构造器中创建. (2)创建表:在SQLiteOpenHelper的子类onCreate方法中,调用execS ...
- ContentProvider中央档案馆,以及获取联系人电话的示例
Android官方文档介绍的数据存储方式共有五种,sqlite,SharedPreferences,网络存储,外储存储,文件存储,但是这些数据都无法进行共享,那么我们就引入了今天的主角:Content ...
- Android基础 : Android ContentProvider
Android 应用程序通过ContentProvider实现方式统一的数据共享功能. 外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据,在Activi ...
- 安卓初級教程(3):ContentProvider的運用原理
package com.example.android.provider; import java.util.ArrayList; import java.util.HashMap; import j ...
- Android探索之ContentProvider熟悉而又陌生的组件
前言: 总结这篇文章之前我们先来回顾一下Android Sqlite数据库,参考文章:http://www.cnblogs.com/whoislcj/p/5506294.html,Android程序内 ...
- 四大组件之ContentProvider
前言 ContentProvider作为Android的四大组件之一,是属于需要掌握的基础知识,可能在我们的应用中,对于Activity和Service这两个组件用的很常见,了解的也很多,但是对Con ...
随机推荐
- vue单页面条件下添加类似浏览器的标签页切换功能
在用vue开发的时候,单页面应用程序,而又有标签页这种需求,各种方式实现不了, 从这个 到这个,然后再返回上面那个 因为每个标签页的route不一样,导致组件重新渲染的问题,怎么都不知道如何实现... ...
- 转载:tf.gfile的用法
https://blog.csdn.net/a373595475/article/details/79693430
- IntelliJ IDEA 2020.2 x64 最新破解教程有效期到2089年 完全免费分享
作者:极客小俊 一个专注于web技术的80后 我不用拼过聪明人,我只需要拼过那些懒人 我就一定会超越大部分人! CSDN@极客小俊,原创文章, B站技术分享 B站视频 : Bilibili.com 个 ...
- 适配器(adapter)与fragment之间、fragment与activity之间的通信问题
一.适配器(adapter)与fragment之间通信 通过本地广播进行通信 步骤如下 在adapter中代码 声明本地广播管理 private LocalBroadcastManager local ...
- Python-通过twisted实现数据库异步插入?
如何通过twisted实现数据库异步插入? 1. 导入adbapi 2. 生成数据库连接池 3. 执行数据数据库插入操作 4. 打印错误信息,并排错 #!/usr/bin/python3 __auth ...
- windows 10 启动修复无法自动修复此计算机
1. 失败后有两个选项卡:关机和高级选项,选择高级选项 2. 然后选择疑难解答 3. 选择高级选项 4. 选择回退到以前的版本 接下来需要登录,选择恢复到上一次正常启动的状态,注意选择保留数据,会有提 ...
- 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬件那些事(2.3)- 串行NOR Flash下载算法(J-Link工具篇)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是J-Link工具下i.MXRT的串行NOR Flash下载算法设计. 在i.MXRT硬件那些事系列之<在串行NOR Flash X ...
- c++模板中set(date st):t(st)中的:符号
转载:https://zhidao.baidu.com/question/618119741512344012.html 半角冒号是构造函数里的初bai始化列表 开始du的标识. 如楼上所述: set ...
- 1.入门篇十分钟了解Spring Cloud
文章目录 Spring Cloud入门系列汇总 为什么需要学习Spring Cloud 什么是Spring Cloud 设计目标与优缺点 设计目标 优缺点 Spring Cloud发展前景 整体架构 ...
- jquery购物车全选,取消全选,计算总金额
这是html代码 <div class="gwcxqbj"> <div class="gwcxd center"> <div cl ...