zoukankan      html  css  js  c++  java
  • Content Provider 总结

    1、实现provider接口,提供给其他程序调用

    第一步: 在manifest.xml中配置 provider 组件

    <provider android:name="MyProvider" android:authorities="com.ruixin.login" />

    其中:name表示 自定义继承于ContentProvider的类名(或者加上包名)
        authorities表示主机名,类似域名

    第二步: 创建数据库,表用来保存数据

    public class DBlite extends SQLiteOpenHelper
    {
        public DBlite(Context context)
        {
            super(context, RuiXin.DBNAME, null, RuiXin.VERSION);
            // TODO Auto-generated constructor stub
        }
    
        @Override
        public void onCreate(SQLiteDatabase db)
        {
            // TODO Auto-generated method stub
            db.execSQL("create table " + RuiXin.TNAME + "(" + RuiXin.TID + " integer primary key autoincrement not null," + RuiXin.EMAIL + " text not null," + RuiXin.USERNAME
                    + " text not null," + RuiXin.DATE + " interger not null," + RuiXin.SEX + " text not null);");
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
        {
            // TODO Auto-generated method stub
        }
    
        public void add(String email, String username, String date, String sex)
        {
            SQLiteDatabase db = getWritableDatabase();
            ContentValues values = new ContentValues();
            values.put(RuiXin.EMAIL, email);
            values.put(RuiXin.USERNAME, username);
            values.put(RuiXin.DATE, date);
            values.put(RuiXin.SEX, sex);
            db.insert(RuiXin.TNAME, "", values);
        }
    }

    第三步: 继承ContentProvider类,提供从数据库中获取数据的接口。 也可以是从文件系统等其他的地方获取

    public class MyProvider extends ContentProvider
    {
    
        DBlite dBlite;
        SQLiteDatabase db;
    
        private static final UriMatcher sMatcher;
        static
        {
                 /**注册Uri,用来适配传入的 Uri,进行判断,区分处理方式*/
            sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
            sMatcher.addURI(RuiXin.AUTOHORITY, RuiXin.TNAME, RuiXin.ITEM);
            sMatcher.addURI(RuiXin.AUTOHORITY, RuiXin.TNAME + "/#", RuiXin.ITEM_ID);
        }
        
        public int delete(Uri uri, String selection, String[] selectionArgs)
        {
            db = dBlite.getWritableDatabase();
            int count = 0;
            switch (sMatcher.match(uri))
            {
            case RuiXin.ITEM:
                count = db.delete(RuiXin.TNAME, selection, selectionArgs);
                break;
            case RuiXin.ITEM_ID:
                String id = uri.getPathSegments().get(1);
                count = db.delete(RuiXin.TID, RuiXin.TID + "=" + id + (!TextUtils.isEmpty(RuiXin.TID = "?") ? "AND(" + selection + ')' : ""), selectionArgs);
                break;
            default:
                throw new IllegalArgumentException("Unknown URI" + uri);
            }
            getContext().getContentResolver().notifyChange(uri, null);
            return count;
        }
        
        public String getType(Uri uri)
        {
            switch (sMatcher.match(uri))
            {
            case RuiXin.ITEM:
                return RuiXin.CONTENT_TYPE;
            case RuiXin.ITEM_ID:
                return RuiXin.CONTENT_ITEM_TYPE;
            default:
                throw new IllegalArgumentException("Unknown URI" + uri);
            }
        }
    
        public Uri insert(Uri uri, ContentValues values)
        {
            db = dBlite.getWritableDatabase();
            long rowId;
            if (sMatcher.match(uri) != RuiXin.ITEM)
            {
                throw new IllegalArgumentException("Unknown URI" + uri);
            }
            rowId = db.insert(RuiXin.TNAME, RuiXin.TID, values);
            if (rowId > 0)
            {
                Uri noteUri = ContentUris.withAppendedId(RuiXin.CONTENT_URI, rowId);
                getContext().getContentResolver().notifyChange(noteUri, null);
                return noteUri;
            }
            throw new IllegalArgumentException("Unknown URI" + uri);
        }
        
        public boolean onCreate()
        {
            this.dBlite = new DBlite(this.getContext());
            return true;
        }
    
        public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
        {
            db = dBlite.getWritableDatabase();
            Cursor c;
            Log.d("-------", String.valueOf(sMatcher.match(uri)));
            switch (sMatcher.match(uri))
            {
            case RuiXin.ITEM:
                c = db.query(RuiXin.TNAME, projection, selection, selectionArgs, null, null, null);
                break;
            case RuiXin.ITEM_ID:
                String id = uri.getPathSegments().get(1);
                c = db.query(RuiXin.TNAME, projection, RuiXin.TID + "=" + id + (!TextUtils.isEmpty(selection) ? "AND(" + selection + ')' : ""), selectionArgs, null, null, sortOrder);
                break;
            default:
                Log.d("!!!!!!", "Unknown URI" + uri);
                throw new IllegalArgumentException("Unknown URI" + uri);
            }
            c.setNotificationUri(getContext().getContentResolver(), uri);
            return c;
        }
    
        public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
        {
            return 0;
        }
    }

    第四步:添加数据到数据库中

    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    
    dBlite1.add("4141414@qq", "jay", "2012", "man");
    dBlite1.add("4141414@qq", "jay", "2013", "man");
    dBlite1.add("4141414@qq", "jay", "2014", "man");
    dBlite1.add("4141414@qq", "jay", "2015", "man");
    dBlite1.add("4141414@qq", "jay", "2016", "man");
    
    }

    2、从ContentProver 中获取数据

    获取数据使用 ContentResolver类,对于使用数据库来保存数据,ContentProvider提供接口来实现数据共享的方法。

    如果Uri后面没有加id项,表示操作目录/表,如果有id项,表示操作该项。下面的例子就是获取Uri路径下所有的项,而不是某一项。

    public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            Log.d("cp" , "content provider");
            // 通过contentResolver进行查找
            contentResolver = ContentProviderClientActivity.this.getContentResolver();
            Uri uri = ContentUris.withAppendedId(RuiXin.CONTENT_URI, 3);
            String type = contentResolver.getType(uri);
            Log.d("cp" , type);
            
            Cursor cursor = contentResolver.query(RuiXin.CONTENT_URI, new String[] { RuiXin.EMAIL, RuiXin.USERNAME, RuiXin.DATE, RuiXin.SEX }, null, null, null);
            while (cursor.moveToNext())
            {
                String text = cursor.getString(cursor.getColumnIndex(RuiXin.EMAIL)) + " " + cursor.getString(cursor.getColumnIndex(RuiXin.USERNAME)) + " "+ cursor.getString(cursor.getColumnIndex(RuiXin.DATE)) + " " + cursor.getString(cursor.getColumnIndex(RuiXin.SEX));
                
                Toast.makeText(ContentProviderClientActivity.this,text, Toast.LENGTH_SHORT).show();
                
                Log.d("cp" , text);
            }
            startManagingCursor(cursor); // 查找后关闭游标
        }
        
        
        
        public class RuiXin {
         
        public static final String DBNAME = "ruixinonlinedb"; 
        public static final String TNAME = "ruixinonline";
        public static final int VERSION = 3;
         
        public static String TID = "tid";
        public static final String EMAIL = "email";
        public static final String USERNAME = "username";
        public static final String DATE = "date";
        public static final String SEX = "sex";
         
         
        public static final String AUTOHORITY = "com.ruixin.login";
        public static final int ITEM = 1;
        public static final int ITEM_ID = 2;
         
        public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.ruixin.login";
        public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.ruixin.login";
         
        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTOHORITY + "/ruixinonline");
    }
  • 相关阅读:
    【leetcode】二叉搜索树的最近公共祖先
    052-12
    052-11
    052-10
    052-9
    052-8
    052-6
    052-5
    052-3
    052-2
  • 原文地址:https://www.cnblogs.com/lipeil/p/2651535.html
Copyright © 2011-2022 走看看