Android:内容提供者(2)

在这里插入图片描述

自己写内容提供者(cp端)

布局:
在这里插入图片描述
相关代码

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/editText"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginTop="167dp"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true" />

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/editText2"
    android:layout_below="@+id/editText"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginTop="35dp"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="save"
    android:id="@+id/save"
    android:layout_below="@+id/editText2"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginTop="29dp" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="get"
    android:id="@+id/get"
    android:layout_alignBottom="@+id/save"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true" />

准备Sqlite数据库

MainActivity 代码

public class MainActivity extends AppCompatActivity {
    private EditText un;
    private EditText pw;
    private Button save;
    private Button get;
    private SQLiteDatabase sqLiteDatabase;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        un= (EditText) findViewById(R.id.editText);
        pw= (EditText) findViewById(R.id.editText2);
        save= (Button) findViewById(R.id.save);
        get= (Button) findViewById(R.id.get);

        save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String unV=un.getText().toString().trim();
                String pwV=pw.getText().toString().trim();

                MySqlite sqlite=new MySqlite(MainActivity.this, "lesson12",1);
                sqLiteDatabase=sqlite.getReadableDatabase();
             /*   String sql="insert into user(un.pw) values('"+unV+"','"+pwV+"')";
                boolean bol=false;
                sqLiteDatabase.execSQL(sql);
                bol=true;*/
                ContentValues contentValues=new ContentValues();
                contentValues.put("un",unV);
                contentValues.put("pw",pwV);
                Long i= sqLiteDatabase.insert("user",null,contentValues);
                Log.i("message",i+"");
            }
        });


        get.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MySqlite mysqlite=new MySqlite(MainActivity.this,"lesson12",1);
                sqLiteDatabase= mysqlite.getReadableDatabase();//库才会创建,并且创建表

                //Cursor相当与Resultset
                Cursor cursor=sqLiteDatabase.rawQuery("select* from user",null);//第二个参数给?赋值
                cursor.moveToNext();//相当于Resultset。next()
                String info=cursor.getString(1);//根据列的索引取值,从0开始
                Log.i("message",info);

                String name=cursor.getColumnName(0);//根据列名取值
                Log.i("message",name);
            }
        });
    }
}

MySqlite 代码

public class MySqlite extends SQLiteOpenHelper {

    public MySqlite(Context context, String name, int version) {
        super(context, "lesson12", null, version);
    }

    //执行创建表的语句,只会调用一次
    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql="create table user(id Integer primary key autoincrement,un varchar(30),pw varchar(30))";
        boolean bol=false;
        db.execSQL(sql);
        bol=true;
    }
//修改表结构,当版本号有更改时调用(版本号的值只能从小到大)
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

写CP端代码

1.创建一个类 继承ContentProvider,重写里面的方法
2,修改onCreate()方法,得到数据库sqLiteDatabase

private SQLiteDatabase sqLiteDatabase;
//得到数据库sqLiteDatabase
@Override
public boolean onCreate() {
    MySqlite mySqlite = new MySqlite(getContext(),5);
    sqLiteDatabase = mySqlite.getReadableDatabase();
    return false;
}

Android中有四大组件 activity service receiver provider ,可通过 getContext()获得上下文
3.制作自己的URL

private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

static{
    //制作uri的三种写法
    //1.p1:类的地址   p2:表名   p3:匹配码
    //content://com.hzyc.tf61.lesson12_1.MyCp/user
    uriMatcher.addURI("com.hzyc.tf61.lesson12_1.MyCp","user",1);//操作的是整张表
    //content://com.hzyc.tf61.lesson12_1.MyCp/user/1
    uriMatcher.addURI("com.hzyc.tf61.lesson12_1.MyCp","user/#",2);//操作的是整张表中的id为#这行数据
    //content://com.hzyc.tf61.lesson12_1.MyCp/user/1/un
    uriMatcher.addURI("com.hzyc.tf61.lesson12_1.MyCp","user/#/*",3);//操作的是整张表中的id为#  列为*  这行这列数据
}

4.在manifest.xml中注册并提供权限
注册权限
permission使用一种权限 exported允许别人访问

  <provider
            android:authorities="com.black.sq.lesson12_1.MyCp"
            android:name=".MyCp"
            android:permission="black.LESSON12_1"
            android:exported="true"
            />

自定义权限
name:给权限起名
label:解释权限的作用
protectionLevel:保护级别
权限的写法:多个单词,每个单词以“.”分割,除了最后一个单词其他的全小写,最后一个单词的所有字母大写

<permission android:name="black.LESSON12_1"
    android:label="get data"
    android:protectionLevel="normal"
    />

cp端完整代码:

public class MyCp extends ContentProvider {
    //先制作自己的URL
    private static UriMatcher uriMatcher=new UriMatcher(UriMatcher.NO_MATCH);
    static {
        //制作URI的三种写法
        uriMatcher.addURI("com.black.sq.lesson12_1.MyCp","user",1);

        uriMatcher.addURI("com.black.sq.lesson12_1.MyCp","user/#",2);

        uriMatcher.addURI("com.black.sq.lesson12_1.MyCp","user/#/*",3);
    }


    private SQLiteDatabase sqLiteDatabase;
    @Override
    public boolean onCreate() {
        MySqlite mySqlite=new MySqlite(getContext(),"lesson12",4);
        sqLiteDatabase=mySqlite.getReadableDatabase();
        return false;
    }

    @Nullable
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        return null;
    }

    @Nullable
    @Override
    public String getType(Uri uri) {
        return null;
    }

    @Nullable
    @Override
    public Uri insert(Uri uri, ContentValues values) {
       int code= uriMatcher.match(uri);
        switch (code){
            case 1: Long i= sqLiteDatabase.insert("user",null,values);//i代表主键
                uri=  ContentUris.withAppendedId(uri,i);//给URI增加ID
                break;
        }

        return uri;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        return 0;
    }
}

访问端

1.在manifest.xml中获取.LESSON12_1权限:

   <uses-permission android:name="black.LESSON12_1"/>

2.布局中准备一个按钮
在这里插入图片描述

扫描二维码关注公众号,回复: 8631465 查看本文章

MainActivity代码:


public class Main3Activity extends AppCompatActivity {
    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);
       button= (Button) findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ContentResolver contentResolver=getContentResolver();

                ContentValues contentValues=new ContentValues();
                contentValues.put("un","abc");
                contentValues.put("pw","123");

                String uri="content://com.black.sq.lesson12_1.MyCp/user";

               Uri uri1= contentResolver.insert(Uri.parse(uri),contentValues);
               //从 uri1中把ID取出
                long id= ContentUris.parseId(uri1);//id就是主键
                Log.i("message",id+"");
            }
        });
    }
}

总结:

App2:
1.准备数据库 Sqlitedatabase 能正常使用(可以在app2内部测试)
2.创建cp端
创建个类,继承ContentProvider,实现6个方法 增删该查 onCreate是用来得到Sqlitedatabase
3.因为cr需要通过url访问cp,cp需要事先定义uri
UriMatcher去定义
4.在manifest.xml中注册provider < provider>
需要权限,自定义权限 < permission></ permission>
App1:
1.创建自己的客户端cr
2.通过uri访问cp uri的写法参照定义好的UriMatcher
3.获得访问app2 cp的权限< use-permissions>

发布了146 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43689040/article/details/103751551