ContentProvider在安卓开发中非常重要。与Activity,Service,BroadcastReceiver并称安卓组件四大天王。
在android中的作用是用来对外共享数据。因为安卓程序的数据库文件存放在data/data/packagename里面,这里面的文件默认都是私有的,别的程序无法访问。
如果QQ游戏想访问手机QQ的帐号信息一键登录,那么就需要使用内容提供者COntentPrivoder来访问。
最常用的就是开发一个程序读取系统的联系人。
实现步骤:
1、写好数据库的增删改查。
package com.hb.db; import java.util.ArrayList; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import com.hb.bean.User; public class DBHelp extends SQLiteOpenHelper { public DBHelp(Context context) { super(context, "Test", null, 1); } @Override public void onCreate(SQLiteDatabase db) { String createTable = "create table users (_id integer primary key autoincrement,name text,phone text)"; db.execSQL(createTable); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } public void add(User user) { SQLiteDatabase database = getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name", user.getName()); values.put("phone", user.getPhone()); database.insert("users", null, values); database.close(); } public void delete(User user) { SQLiteDatabase database = getWritableDatabase(); database.delete("users", "name = ? or phone = ?", new String[] { user.getName(), user.getPhone() + "" }); database.close(); } public ArrayList<User> getData() { ArrayList<User> list = new ArrayList<User>(); // 获得所有的数据 String sql = "select * from users"; SQLiteDatabase sdb = this.getReadableDatabase(); Cursor cursor = sdb.rawQuery(sql, null); while (cursor.moveToNext()) { String name = cursor.getString(1); String phone = cursor.getString(2); list.add(new User(Long.parseLong(phone), name)); } cursor.close(); sdb.close(); return list; } }
2、写内容提供者MyProvider继承ContentProvider,使用静态块初始化UriMatcher,重写ContentProvider里面的6个方法
static {
matcher = new UriMatcher(UriMatcher.NO_MATCH);
// 查询
matcher.addURI("com.hb.provider", "get", 10);
// 插入
matcher.addURI("com.hb.provider", "insert", 20);
// 删除
matcher.addURI("com.hb.provider", "delete/#", 30);
}
只实现了delete,querry,insert方法,update类似
package com.hb.provider; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.net.Uri; import android.util.Log; import com.hb.db.DBHelp; public class MyProvider extends ContentProvider { static UriMatcher matcher; static { matcher = new UriMatcher(UriMatcher.NO_MATCH); // 查询 matcher.addURI("com.hb.provider", "get", 10); // 插入 matcher.addURI("com.hb.provider", "insert", 20); // 删除 matcher.addURI("com.hb.provider", "delete/#", 30); } @Override public boolean onCreate() { return true; } /** * uri,要查询的字段名,where条件,where语句中?的值,排序字段 */ @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { int code = matcher.match(uri); Log.i("Test", code + ""); switch (code) { case 10: DBHelp db = new DBHelp(getContext()); Cursor cursor = db.getReadableDatabase().rawQuery( "select * from users", null); return cursor; } return null; } @Override public String getType(Uri uri) { return null; } @Override public Uri insert(Uri uri, ContentValues values) { int code = matcher.match(uri); switch (code) { case 20: DBHelp db = new DBHelp(getContext()); long id = db.getWritableDatabase().insert("users", null, values); return ContentUris.withAppendedId(uri, id); } return null; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { int code = matcher.match(uri); switch (code) { case 30: DBHelp db = new DBHelp(getContext()); int id = db.getWritableDatabase().delete("users", selection, selectionArgs); return id; } return 0; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { return 0; } }
一定要记得在AndroidMenifest清单文件里注册,它和Activity一样,放在Application节点下
<provider
android:name="com.hb.provider.MyProvider"
android:authorities="com.hb.provider" >
</provider>
此时,内容提供者就已经写好了。再写另外一个程序对其数据库进行操作。
3、写其他程序访问内容提供者
在Activity里面,可以使用context调用getContentResolver()方法得到ContentResolver resolver = getContentResolver();
,之后就可以使用resolver对数据库进行操作了。
首先,会根据uri找到对应的应用程序,再根据insert之类的子命令找到对应定义号的code(20),执行MyProvider里面的insert方法。其中uri中的“content://”是内容提供者的固定写法。
package com.example.testprovider; import java.util.ArrayList; import com.hb.bean.User; import android.app.Activity; import android.content.ContentResolver; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.View; public class MainActivity extends Activity { private ContentResolver resolver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate (savedInstanceState); setContentView(R.layout.activity_main); resolver = this.getContentResolver(); } public void delete(View v) { Uri uri = Uri.parse ("content://com.hb.provider/delete/1"); // 删除phone为123的人 int count = resolver.delete (uri, "phone = ?", new String[] { "123" }); Log.i("Test", count + "条数据被删除"); } public void querry(View v) { Uri uri = Uri.parse ("content://com.hb.provider/get"); Cursor cursor = resolver.query(uri, null, null, null, null); if (cursor != null) { ArrayList<User> list = new ArrayList<User>(); while (cursor.moveToNext()) { String name = cursor.getString(1); String phone = cursor.getString(2); list.add(new User(Long.parseLong(phone), name)); } Log.i("Test", list.toString()); } else { Log.i("Test", "没查到"); } } public void insert(View v) { Uri uri = Uri.parse ("content://com.hb.provider/insert"); ContentValues values = new ContentValues(); values.put("name", "name"); values.put("phone", "111"); resolver.insert(uri, values); } }
相关推荐
一个标准的Android应用通常由多个组件构成,包括Activity(界面)、Service(后台服务)、BroadcastReceiver(广播接收者)以及ContentProvider(数据提供者)。在课程表应用中,Activity将用于展示课程信息,可能...
在Android开发中,数据库操作是应用的核心功能之一。`LoadSQLiteManager`是一个示例项目,展示了如何使用异步方式加载SQLite...在实际开发中,这样的设计模式有助于提高应用性能,减少UI阻塞,并提供更好的用户体验。
在Android应用开发中,性能优化是一项至关重要的技能,尤其对于初中级开发者来说,掌握这方面的知识不仅能够提升应用的用户体验,还能在面试中展现自己的专业素养。本篇内容将聚焦于Android开发中的性能优化,主要从...
在本篇“Android真实项目教程(二)——漫画App初构_by_CJJ”中,我们将深入探讨如何构建一个基础的漫画阅读应用。这个教程由CJJ提供,专注于Android平台的开发,是Android开发者学习实际项目经验的良好资源。下面,...
一个基本的Android应用由多个组件构成,包括Activity、Service、BroadcastReceiver、ContentProvider等。在这个简单的音乐播放器中,最核心的组件可能是Activity,因为它负责用户界面的交互。开发者可能使用了...
一个标准的Android应用由多个组件构成,包括Activity、Service、BroadcastReceiver、ContentProvider等。在这个初级记事本应用中,主要涉及的是Activity,它是用户界面的主要载体。开发者通常会创建一个或多个...
这个初体验章节主要涵盖了以下几个核心知识点: 1. **Android程序架构**:Android应用程序基于Java语言,采用组件化的方式构建,主要包括Activity(活动)、Service(服务)、BroadcastReceiver(广播接收者)、...
本资料集合包含了多个关键的Android模块开发的源代码,适合初入Android开发领域的工作者学习和参考。通过深入理解和实践这些代码,开发者可以对Android应用的各个层面有更全面、深入的理解。 1. **Activity与Intent...
这些都是Android应用性能优化的关键技术,能帮助开发者理解如何避免阻塞主线程,提升用户体验。 事件总线(如EventBus)和依赖注入框架(如Dagger)的应用也是现代Android开发的常见实践。通过陌陌源码,我们可以...
这个项目适用于初入IT行业的毕业生,特别是那些对Android开发感兴趣的学生或者开发者。它支持使用Android Studio、IntelliJ IDEA以及Eclipse进行开发,但推荐使用前两者,因为它们提供了更现代、更强大的集成开发...
总的来说,《Android开发教程》是全面而深入的,涵盖了Android开发的各个方面,无论你是初入此领域的新手,还是寻求提高的开发者,都能从中受益匪浅。通过阅读这本书,你将能够熟练地开发出自己的Android应用程序,...
总之,"Android程序员指南"与"應用框架原理與程式计36技"两本书是Android开发者的重要参考资料,无论你是初入行业的新人还是寻求突破的资深开发者,都能从中受益匪浅。通过系统学习和实践,你将能够构建出高效、稳定...
《Android典型技术模块开发详解》这本书是为初入Android开发领域的工作者量身打造的指南,旨在帮助读者深入理解和掌握Android各个关键模块的开发技术。在本文中,我们将详细探讨书中可能涉及的重要知识点,并尽可能...
《Android开发进阶从小工到专家》是由资深Android开发者何红辉编著的一本专业书籍,旨在帮助初入Android开发领域的工程师逐步提升技能,直至达到专家级别。这本书以清晰的结构和高清的书签版形式呈现,使得学习过程...
使用SQL语句进行数据的增删改查,并通过Android的ContentProvider或Room库封装数据库操作,提供更安全、高效的访问方式。 此外,App可能还包含其他功能,如建材商品展示、分类、搜索、购物车等。这需要开发者掌握...
Android的视图系统是构建用户界面的基础,掌握如何有效地布局和设计UI对于提升用户体验有着决定性的影响。 在程序开发方面,本书会介绍Android Studio的使用,包括项目构建、调试技巧以及Gradle构建系统。还会涉及...
- **ContentProvider**:存储和检索数据,并让这些数据可以被其他应用程序访问。 #### 5. 音乐播放器功能实现 - **播放/暂停功能**:利用MediaPlayer类实现音乐的播放与暂停操作。 - **上一曲/下一曲**:通过维护...
通过"手机控制项.pdf"、"使用者人机界面+SDK-Google+Android+SDK开发范例大全.pdf"和"Android初体验.pdf"这三份文档,读者可以深入学习到实际的案例和实践,从而将理论知识转化为实际的编程技能。这些文档可能包含...
无论你是初入Android世界的新人,还是经验丰富的老手,都能从中受益匪浅。 首先,让我们来看看AndroidBox0.5中的核心知识点——Android组件。Android四大组件(Activity、Service、BroadcastReceiver、...