竹木人

----------------隐感存理,去伪存真,做个安分的守候者

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

网上关于利用ContentProvider实现数据、文件等的共享,例子很多,我会一一罗列,别人写过的我就不费话了:

重要的几点:

1、ContentProvider基本不需要用户与它的对象交互,系统会自动唤醒所有注册了的provider

2、ContentProvider的OnCreate方法,并不是一直被系统调用的<网上好多人是误导,本人亲测,只有你第一次安装该apk的时候才会被调用>

  <SqliteHelper Oncreate方法没有被调用的原因!>

3、SqliteHelper的OnCreate方法也是,并不是第一次安装应用时,没有该数据库才会调用,而需要手动通过new出来的一个SqliteHelper对象去调用它的

  getReadableDatabase来实现

4、本人观点,如果大家发现有不妥的,欢迎指正,有空把流程图补上,外带一个源码发过来!

http://blog.csdn.net/liuhe688/article/details/7050868<教程1>

http://www.cnblogs.com/linjiqin/archive/2011/05/28/2061396.html<教程2>

当然,别人的东西是别人的,学习完之后自己也得总结总结:

------------------------------------------------------------------------------------------------------------------------------------

首先:ContentProvider是应用程序之间数据存储跟检索的一个桥梁,他的作用是使得多个应用程序之间可以实现数据共享

ContentProvider的使用:

1、必须在AndroidManifest.xml里进行注册

<provider
    android:name=".provider.className"<!--需与包下的provider类相一致-->
    android:authorities="LocalShelves"<!--需要共享,该授权必须唯一,要不多个应用就不知道该使用哪个Provider了-->   
/>

2、创建Provider类

在以上1、2教程里应该写的很清楚,不多说,大体思路就是

package org.curiouscreature.android.shelves.provider;
public  class youProvider extends ContentProvider{

    private final static String LOCAL_DB_NAME="yourDbName.db";
    private final static int    DB_VERSION=1;
   //引入mOpenHelper实现第一次创建数据表
private SQLiteOpenHelper mOpenHelper;
//用来匹配以后的查询项,根据匹配到的查询项,做相应的查询
private static final UriMatcher URI_MATCHER;
//授权“域名”,必须唯一,且与AndroidManifest里面注册的须一致
private final static String AUTHORITY="LocalShelves";
   //以下是不同查询项的状态码
private static final int SEARCH = 1; private static final int NAMES = 2; private static final int NAMES_ID = 3; static { URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
     //先将各项注册进去,才能在后面用到后进行匹配 URI_MATCHER.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, SEARCH); URI_MATCHER.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY
+ "/*", SEARCH); URI_MATCHER.addURI(AUTHORITY, "name", NAMES); URI_MATCHER.addURI(AUTHORITY, "name/#", NAMES_ID); } @Override public boolean onCreate() { // TODO Auto-generated method stub Log.w("pdb","run here");
     //这块搞了我大半天,所有东西都搞定了,就是表建不出来,原来SqliteHelper的OnCreate()方法不会被自动调用,只有使用getReadableDatabase()后才会新建     表 mOpenHelper
=new DatabaseHelper(getContext()); mOpenHelper.getReadableDatabase(); mOpenHelper.getWritableDatabase(); return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // TODO Auto-generated method stub return null; } @Override
   //查询类型定义
public String getType(Uri uri) { switch (URI_MATCHER.match(uri)) { case BOOKS: return "vnd.android.cursor.dir/vnd.org.curiouscreature.provider.yourprovider"; case BOOK_ID: return "vnd.android.cursor.item/vnd.org.curiouscreature.provider.yourprovider"; default: throw new IllegalArgumentException("Unknown URI " + uri); } }    @Override public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub return null; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; } //内部类,java知识,需要的可以去本博客查看 private static class DatabaseHelper extends SQLiteOpenHelper { /** * @funtion 构造函数 * @param context */ public DatabaseHelper(Context context) { super(context, LOCAL_DB_NAME, null, DB_VERSION); // TODO Auto-generated constructor stub }      //新建表的语句在这里写,onCreate()方法没调用是因为它不是构造函数,不会被自动调用,需要手动通过上面提到的方法调用 @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub Log.w("table create tag","yessss"); db.execSQL("........此处省略若干字"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub db.execSQL("DROP TABLE IF EXISTS XXXX"); onCreate(db); } } }

3、获得provider并进行相关操作:

     在需要的地方加入以下代码,然后进行相关操作

ContentResolver cr = this.getContentResolver();  

OK,基本步骤就是这样,打完收工,回家吃饭,有空把流程图补上!

 

posted on 2012-06-29 18:08  竹木人  阅读(4736)  评论(0编辑  收藏  举报