Android-ContentProvider之应用之间互传数据-刘宇

什么是ContentProvider呢,中文就内容提供者,他能将一个应用中的数据保存至数据库,并且这个数据库是私有的,在内部存储中,然后供其他应用访问。需要供其他应用访问,前提就是在这个应用下的AndroidManifest.xml设置内容提供者代码:

注意:

authorities是数据共享相当于钥匙,只有填对了这个才能访问,自定义

name:内容提供者的名字,自定义

exported:为true才能将数据库作为内容来供外界应用访问

 



        


效果图:

 

Android-ContentProvider之应用之间互传数据-刘宇_第1张图片

 

首先,先创建两个空的应用,

第一个应用:用来提供数据

            创建一个新类,我命名为:MyProvider.java,需要继承ContentProvider并实现其方法。

            修改AndroidManifest.xml文件添加内容提供者组件

第二个应用:用来读取数据

 


下面来说说第一个应用的代码:

activity_main.xml:

 



    
    


AndroidManifest.xml:

 

 




    
        
            
                

                
            
        
        

        
    


MyProvider.java:

 

 

package com.oak.d2_contentprovider_writer;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.support.annotation.Nullable;

public class MyProvider extends ContentProvider {
    //静态常量,内容提供者存储数据需要的URL,就是AndroidManifest中设置的authorities
    public static final Uri URL = Uri.parse("content://com.oak.contentprovider");
    private SQLiteDatabase sqLiteDatabase;//数据库
    private int isOk =0;//判断数据库中是否存在tab这个表,如果存在,就不再创建。
    @Override
    public boolean onCreate() {
        //打开或创建一个数据库,名字为data.db,私有的
        sqLiteDatabase = getContext().openOrCreateDatabase("data.db", Context.MODE_PRIVATE,null);
        //查找出这个数据库中的所有表
        Cursor cursor = sqLiteDatabase.rawQuery("select name from sqlite_master where type='table';", null);
        //将查询出的结果的指针移到第一个,然后循环
        cursor.moveToFirst();
        while(cursor.moveToNext()){
            //遍历出表名
            String name = cursor.getString(0);
            System.out.println("存在表:"+ name);
            //如果存在则不执行下面的if语句中的创建表代码
            if (name == "tab")
                isOk=1;
        }
        //创建表代码
        if (isOk==0)
            sqLiteDatabase.execSQL("create table tab (_id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL)");
        //这里要返回true
        return true;
    }

    @Nullable
    @Override
    public Uri insert(Uri uri, ContentValues contentValues) {
        //添加数据到表tab中
        sqLiteDatabase.insert("tab","_id",contentValues);
        return null;
    }

    @Nullable
    @Override
    public Cursor query(Uri uri, String[] strings, String s, String[] strings1, String s1) {
        //查找tab中的数据
        Cursor cursor = sqLiteDatabase.query("tab",null,null,null,null,null,null);
        return cursor;
    }

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

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

    @Override
    public int update(Uri uri, ContentValues contentValues, String s, String[] strings) {
        return 0;
    }
}


MainActivity.java

 

 

package com.oak.d2_contentprovider_writer;

import android.content.ContentValues;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    private Button bt_insert;//拿到写入按钮
    private EditText et;//那到编辑框
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //找到组件编辑框
        et = (EditText) findViewById(R.id.et);
        //找到组件写入按钮
        bt_insert = (Button) findViewById(R.id.bt_insert);
        //为写入按钮添加侦听事件
        bt_insert.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //将编辑框内容保存到变量txt中
                String txt = et.getText().toString();
                //实例化ContentValues,然后添加数据
                ContentValues values = new ContentValues();
                Toast.makeText(getApplicationContext(),txt,Toast.LENGTH_SHORT).show();
                values.put("name",txt);
                //将ContenValues传递到数据库中
                getContentResolver().insert(MyProvider.URL,values);
            }
        });
    }
}


第一个应用到这里就结束了,下面我们来写读取内容的第二个应用。

 

 

第二应用代码如下:

MainActivity.java:

 

package com.oak.d2_contentprovider_reader;

import android.database.Cursor;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    //这里写读取那个应用中AndroidManifest中设置的authorities,写错了就读取不到了
    private static final Uri URI = Uri.parse("content://com.oak.contentprovider");
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //查询数据库中的内容,然后返回结果
        Cursor cursor =  getContentResolver().query(URI,null,null,null,null);
        //将返回的结果的指针移到第一个
        cursor.moveToFirst();
        //循环结果
        for (int i=0;i


到这里就完成了利用内容提供者两个应用之间数据的传递。还有不懂的童鞋们可以给我留言,我会第一时间回复你们的。

 

By:Brycen Liu

 

你可能感兴趣的:(Android)