25.ContentProvider自定义内容提供者与ContentResolver内容访问者

来源:互联网 发布:ansible.cfg mac 编辑:程序博客网 时间:2024/06/06 00:08

一.知识概括


二.案例

两个demo
一个专门用来提供数据    ContentProvider内容提供者(存在:数据库)
另一个demo专门用来访问数据   ContentResolver内容访问者
把Android25_ContentProvider里面的数据提供出去


具体代码实现如下

android25_contentprovider项目

activity_main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context="com.zking.android25_contentprovider.MainActivity">    <EditText        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:hint="用户名:"        android:id="@+id/et_main_uname"        />    <EditText        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:hint="密码:"        android:id="@+id/et_main_upass"        />    <Button        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="操作"        android:onClick="operation"        /></LinearLayout>
MainActivity.java
package com.zking.android25_contentprovider;import android.database.sqlite.SQLiteDatabase;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.EditText;import com.zking.db.DBHelper;public class MainActivity extends AppCompatActivity {        private EditText et_main_uname;        private EditText et_main_upass;        private SQLiteDatabase sqLiteDatabase;        @Override        protected void onCreate(Bundle savedInstanceState) {                super.onCreate(savedInstanceState);                setContentView(R.layout.activity_main);                //获取用户名及密码                et_main_uname = (EditText) findViewById(R.id.et_main_uname);                et_main_upass = (EditText) findViewById(R.id.et_main_upass);                //拿到DBHelper这个类                DBHelper dbHelper=new DBHelper(this,"databaseName.db",null,1);                sqLiteDatabase = dbHelper.getWritableDatabase();        }        //点击事件        public void operation(View view){//保存                //一点就拿到用户名和密码                String uname=et_main_uname.getText().toString();                String upass=et_main_upass.getText().toString();                //添加100条测试数据                for (int i = 0; i <100 ; i++) {                    sqLiteDatabase.execSQL("insert into login(uname,upass) values('第"+i+"个人','123')");                }                //分页                int pageNo=2;//拿第几页                int pageSize=3;//每页拿几条//                Cursor cursor=sqLiteDatabase.rawQuery("select * from login limit ?,?",new String[]{((pageNo-1)*pageSize)+"",pageSize+""});//                while (cursor.moveToNext()){//                        int uid=cursor.getInt(cursor.getColumnIndex("uid"));//                        String name=cursor.getString(cursor.getColumnIndex("uname"));//                        String pass=cursor.getString(cursor.getColumnIndex("upass"));//                        Log.i("test",uid+" "+name+" "+pass);//                }//                Toast.makeText(this, "查看成功", Toast.LENGTH_SHORT).show();        }}
DBHelper.java
package com.zking.db;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import android.util.Log;/** * Created by Administrator on 2017/6/25 0025. * 数据库(不需要指定数据类型,没有用户名 密码等这个概念) */public class DBHelper extends SQLiteOpenHelper{        /**         * 构造:4个参数         * @param context    上下文         * @param name       数据库的名字,sqlite数据库本质也是一个文件  这个name也被称为“文件名” 一般以.db为结尾         * @param factory    数据库工厂,一般为null         * @param version    数据库的版本(例如加表的情况,1.0版本,2.0版本等)         */        public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {                super(context, name, factory, version);                Log.i("test","构造方法");//打印测试一下        }        //使用该方法:创建表        //只会调用一次(因为第一次表就已经创建好了)        @Override        public void onCreate(SQLiteDatabase db) {                Log.i("test","创建表");                db.execSQL("create table login(uid integer primary key autoincrement,uname,upass)");//创建表的sql语句  主键:primary key  自动增长:autoincrement        }        //数据库版本升级 低-->高(想加一个表,及版本从1.0改为2.0自动调用此方法)        @Override        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {                Log.i("test","升级数据库版本");        }        //降级:3.0版本改为2.0版本(一般情况下不会存在)//        @Override//        public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {//            super.onDowngrade(db, oldVersion, newVersion);//        }}
MyProvider.java
package com.zking.provider;import android.content.ContentProvider;import android.content.ContentValues;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.net.Uri;import android.support.annotation.NonNull;import android.support.annotation.Nullable;import android.util.Log;import com.zking.db.DBHelper;/** * 我的内容提供者 * */public class MyProvider extends ContentProvider {        @Override        public boolean onCreate() {            Log.i("test","onCreate");            return false;        }        @Nullable        @Override        public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {            Log.i("test","query");            //拿到DBHelper这个类            DBHelper dbHelper=new DBHelper(getContext(),"databaseName.db",null,1);//getContext()上下文对象            SQLiteDatabase sqLiteDatabase = dbHelper.getWritableDatabase();            return sqLiteDatabase.rawQuery("select * from login",null);//没有参数为null        }        @Nullable        @Override        public String getType(@NonNull Uri uri) {            Log.i("test","getType");            return null;        }        @Nullable        @Override        public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {            Log.i("test","insert");            return null;        }        @Override        public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {            Log.i("test","delete");            return 0;        }        @Override        public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {            Log.i("test","update");            return 0;        }}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.zking.android25_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">        <activity android:name=".MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <!--配置内容提供者-->        <provider            android:authorities="com.zking.android25_contentprovider.ZHONGZI"            android:name="com.zking.provider.MyProvider"            android:exported="true"            >        </provider><!--作者(网址 包名.种子网):  exported:可访问-->    </application></manifest>

android25_contentresolver项目

MainActivity.java

package com.zking.android25_contentresolver;import android.content.ContentResolver;import android.database.Cursor;import android.net.Uri;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;/** * 内容访问者(实际生活中用的比内容提供者多) * 应用程序一启动就拿数据 */public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //获取android25_contentprovider的数据        //获取内容访问者        ContentResolver cr=getContentResolver();        //content协议:域名        Uri uri=Uri.parse("content://com.zking.android25_contentprovider.ZHONGZI");        //传参        //cr.query(uri,null,null,null,null);        Cursor cursor=cr.query(uri,null,null,null,null);        while(cursor.moveToNext()){//拿值            String uname=cursor.getString(cursor.getColumnIndex("uname")) ;//列名可以改为用下标0,1,2等            Log.i("test",uname);        }    }}


效果图




阅读全文
0 0
原创粉丝点击