• ContentProvider实例整理


    用到了四个类:

    class MainActivity extends Activity;

    class DatabaseHelper extends SQLiteOpenHelper;

    class MyMetaData;

    class MyCP extends ContentProvider;

    一、MainActivity:

    package com.example.contentprovider;
    
    import android.app.Activity;
    import android.content.ContentValues;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    import com.example.contentprovider.MyMetaData.UserTableMetaData;
    
    public class MainActivity extends Activity {
    
        Button insert,query;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            insert = (Button) findViewById(R.id.insert);
            insert.setOnClickListener(new InsertListener());
            query = (Button) findViewById(R.id.query);
            query.setOnClickListener(new QueryListener());
        }
    
        class InsertListener implements OnClickListener{
    
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                ContentValues values = new ContentValues();
                values.put(UserTableMetaData.USER_NAME, "michal");
                Uri uri = getContentResolver().insert(
                        UserTableMetaData.CONTENT_URI, values);
                System.out.println("uri--->" + uri.toString());
            }
            
        }
        class QueryListener implements OnClickListener{
    
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Cursor c = getContentResolver().query(
                          UserTableMetaData.CONTENT_URI, null,
                          null, null, null);
                   while (c.moveToNext()) {
                      System.out.println(c.getString(c.getColumnIndex(UserTableMetaData.USER_NAME)));
                   }
            }
            
        }
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    
    }

    二、DatabaseHelper extends SQLiteOpenHelper

    package com.example.contentprovider;
    
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    
    public class DatabaseHelper extends SQLiteOpenHelper{
    
        
        public DatabaseHelper(Context context) {
            super(context, MyMetaData.DATABASE_NAME, null, MyMetaData.DATABASE_VERSION);
            // TODO Auto-generated constructor stub
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
            // TODO Auto-generated method stub
            String sql = "CREATE TABLE "+MyMetaData.UserTableMetaData.TABLE_NAME+" (_id INTEGER PRIMARY KEY AUTOINCREMENT, "+MyMetaData.UserTableMetaData.USER_NAME+" VARCHAR)";
            db.execSQL(sql);
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub
            
        }
        
    }

    三、MyMetaData

    package com.example.contentprovider;
    
    import android.net.Uri;
    import android.provider.BaseColumns;
    
    public class MyMetaData {
        // 继承了contentprovider的类的全名
        public static final String AUTHORITY = "com.example.contentprovider.mycp";
        // 数据库名称
        public static final String DATABASE_NAME = "FirstProvider.db";
        // 数据库的版本
        public static final int DATABASE_VERSION = 1;
        
        // 静态内部类创建一个表
        public static final class UserTableMetaData implements BaseColumns {
            // 表名
            public static final String TABLE_NAME = "users";
            // 访问该ContentProvider的表的URI
            public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + TABLE_NAME);
            //规定
            public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.mycp.user";
            public static final String CONTENT_TYPE_ITEM = "vnd.android.cursor.item/vnd.mycp.user";
            // 列名,在users表中添加一个名为name的列
            public static final String USER_NAME = "name";
            // 默认排序方式
            public static final String DEFAULT_SORT_ORDER = "_id desc";
        }
    }

    四、MyCP extends ContentProvider

    package com.example.contentprovider;
    
    import java.util.HashMap;
    
    import android.content.ContentProvider;
    import android.content.ContentUris;
    import android.content.ContentValues;
    import android.content.UriMatcher;
    import android.database.Cursor;
    import android.database.SQLException;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteQueryBuilder;
    import android.net.Uri;
    import android.text.TextUtils;
    
    import com.example.contentprovider.MyMetaData.UserTableMetaData;
    
    public class MyCP extends ContentProvider {
    
        public static final UriMatcher uriMatcher;
        // 下面定义两个规则
        public static final int INCOMING_USER_COLLECTION = 1;
        public static final int INCOMING_USER_SINGLE = 2;
        private DatabaseHelper dh;
        static {
            uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);// 不匹配根目录
            // 多条
            uriMatcher.addURI(MyMetaData.AUTHORITY, "users",INCOMING_USER_COLLECTION);
            // 单条
            uriMatcher.addURI(MyMetaData.AUTHORITY, "users/#", INCOMING_USER_SINGLE);
        }
        // 有点类似于sql里面表的别名,这个也是给列其别名,必须要用
        // 列的别名还是原来的名,没必要修改
        public static HashMap<String, String> userProjectionMap;
        static {
            userProjectionMap = new HashMap<String, String>();
            userProjectionMap.put(UserTableMetaData._ID, UserTableMetaData._ID);
            userProjectionMap.put(UserTableMetaData.USER_NAME,UserTableMetaData.USER_NAME);
        }
    
        @Override
        public boolean onCreate() {
            // TODO Auto-generated method stub
            //getContext得到当前正在运行着的context
            dh = new DatabaseHelper(getContext());
            System.out.println("on create --> dh = new DatabaseHelper(getContext())");
            return true;
        }
    
        @Override
        public String getType(Uri uri) {
            // TODO Auto-generated method stub
            System.out.println("getType-->");
            switch (uriMatcher.match(uri)) {
            case INCOMING_USER_COLLECTION:
                return UserTableMetaData.CONTENT_TYPE;
            case INCOMING_USER_SINGLE:
                return UserTableMetaData.CONTENT_TYPE_ITEM;
            default:
                    throw new IllegalArgumentException("Unknown uri" + uri);
            }
        }
        
        @Override
        public Cursor query(Uri uri, String[] projection, String selection,
                String[] selectionArgs, String sortOrder) {
            // TODO Auto-generated method stub
            System.out.println("query");
           //创建一个查询的语句
           SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
         //设置查询哪张表
           qb.setTables(UserTableMetaData.TABLE_NAME);
           qb.setProjectionMap(userProjectionMap);
           switch(uriMatcher.match(uri)){
           case INCOMING_USER_COLLECTION:
               break;
           case INCOMING_USER_SINGLE:
               //添加where条件,getPathSegments:得到uri的path部分content:XXX/user/1,get(1)得到1
               qb.appendWhere(UserTableMetaData._ID+"="+uri.getPathSegments().get(1));
               break;
           }
              
           String orderBy;
           if(TextUtils.isEmpty(sortOrder)){
               orderBy = UserTableMetaData.DEFAULT_SORT_ORDER;
           }
           else
           {
               orderBy = sortOrder;
           }
           SQLiteDatabase db = dh.getWritableDatabase();
           //下面的query使用qb这个对象
           Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
           //也是通知下
           c.setNotificationUri(getContext().getContentResolver(), uri);
           return c;
        }
    
        @Override
        public Uri insert(Uri uri, ContentValues values) {
            // TODO Auto-generated method stub
            System.out.println("insert-->");
            SQLiteDatabase db = dh.getWritableDatabase();
            long rowId = db.insert(UserTableMetaData.TABLE_NAME, null, values);
             if(rowId>0){
                   //将rowId追加到后面
                   //contentUris:用来处理Uri的工具类
                   Uri insertedUserUri = ContentUris.withAppendedId(UserTableMetaData.CONTENT_URI, rowId);
                   //通知监听器,数据已经改变
                   getContext().getContentResolver().notifyChange(insertedUserUri, null);
                   return insertedUserUri;
               }
             throw new SQLException("Failed to insert row into "+uri);
        }
    
        @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;
        }
    
    }

    最后记得在AndroidManifest.xml里配置:

    <provider 
                android:name="com.example.contentprovider.MyCP"
                android:authorities="com.example.contentprovider.mycp">
    </provider>
  • 相关阅读:
    三次握手与四次挥手原理
    动态主机配置协议(DHCP)
    网络知识-OSI7层模型说明和相关协议
    企业面试题合集
    优先队列(priority_queue)自定义排序方法
    优先队列(priority_queue)自定义排序方法
    C. Playlist(权值线段树查询前k大和)
    C. Playlist(权值线段树查询前k大和)
    C++判断四个点能否构成正方形/矩阵
    C++判断四个点能否构成正方形/矩阵
  • 原文地址:https://www.cnblogs.com/qchy/p/2984473.html
Copyright © 2020-2023  润新知