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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liuyu973971883/article/details/52926027

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

注意:

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

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

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

 

<span style="font-size:18px;"><provider
            android:authorities="com.oak.contentprovider"
            android:name="MyProvider"
            android:exported="true" >

        </provider></span>


效果图:

 

 

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

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

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

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

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

 


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

activity_main.xml:

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.oak.d2_contentprovider_writer.MainActivity">
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/et"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="写入"
        android:id="@+id/bt_insert"/>
</LinearLayout>


AndroidManifest.xml:

 

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.oak.d2_contentprovider_writer">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        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.oak.contentprovider"
            android:name="MyProvider"
            android:exported="true" >

        </provider>
    </application>

</manifest>


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<cursor.getCount();i++) {
            //将数据赋值给txt变量
            String txt =  cursor.getString(cursor.getColumnIndex("name"));
            //吐司出来
            Toast.makeText(getApplicationContext(),txt,Toast.LENGTH_SHORT).show();
            //没循环一次,移到指针到下一个
            cursor.moveToNext();
        }
    }
}


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

 

By:Brycen Liu

 

展开阅读全文

没有更多推荐了,返回首页