编写提供程序数据外部接口的程序

12 篇文章 0 订阅

上一篇文章讲了如何去访问其他程序暴露出来的数据,那么这篇文章就来讲一下如何暴露数据给外部程序访问。要暴露数据给外部程序,我们要使用ContentProvider,创建一个类去继承ContentProvider实现一个我们自己的内容提供器,并实现其中的抽象方法。具体实例如下:新建一个SqliteDatabae项目,其中:

activity_main.xml中的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/createDatabase"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Create Database"
        android:textAllCaps="false"/>

    <Button
        android:id="@+id/addData"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Add Data"
        android:textAllCaps="false"/>

    <Button
        android:id="@+id/updateData"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Update Data"
        android:textAllCaps="false"/>

    <Button
        android:id="@+id/deleteData"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Delete Data"
        android:textAllCaps="false"/>

    <Button
        android:id="@+id/queryData"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Query Data"
        android:textAllCaps="false"/>

</LinearLayout>

AndroidManifest.xml中的代码如下:

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

    <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:name=".StudentProvider"
            android:authorities="com.tangliang.sqlitedatabase.provider"
            android:enabled="true"
            android:exported="true"></provider>
    </application>

</manifest>

MyDatabaseHelper类中的代码如下:

package com.tangliang.sqlitedatabase;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;

/**
 * Created by tangliang on 2017-07-25.
 */

public class MyDatabaseHelper extends SQLiteOpenHelper {

    public static final String CREATE_STUDENT = "create table Student ("
            + "id integer primary key autoincrement, "
            + "name text, "
            + "age integer)";

    public static final String CREATE_COURSE = "create table Course ("
            + "id integer primary key autoincrement, "
            + "courseName text, "
            + "courseCredit integer)";

    private Context mContext;

    public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version){
        super(context, name, factory, version);
        mContext = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_STUDENT);
        db.execSQL(CREATE_COURSE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table if exists Student");
        db.execSQL("drop table if exists Course");
        onCreate(db);
    }
}



StudentProvider中的代码如下:

package com.tangliang.sqlitedatabase;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;

public class StudentProvider extends ContentProvider {

    public static final int STUDENT_DIR = 0;

    public static final int STUDENT_ITEM = 1;

    public static final int COURSE_DIR = 2;

    public static final int COURSE_ITEM = 3;

    public static final String AUTHORITY = "com.tangliang.sqlitedatabase.provider";

    private static UriMatcher uriMatcher;

    private MyDatabaseHelper dbHelper;

    static {
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        uriMatcher.addURI(AUTHORITY, "student", STUDENT_DIR);
        uriMatcher.addURI(AUTHORITY, "student/#", STUDENT_ITEM);
        uriMatcher.addURI(AUTHORITY, "course", COURSE_DIR);
        uriMatcher.addURI(AUTHORITY, "course/#", COURSE_ITEM);
    }

    public StudentProvider() {
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
       SQLiteDatabase db = dbHelper.getWritableDatabase();
        int deletedRows = 0;
        switch (uriMatcher.match(uri)){
            case STUDENT_DIR:
                deletedRows = db.delete("Student", selection, selectionArgs);
                break;
            case STUDENT_ITEM:
                String studentId = uri.getPathSegments().get(1);
                deletedRows = db.delete("Student", "id = ?", new String[]{studentId});
                break;
            case COURSE_DIR:
                deletedRows = db.delete("Course", selection, selectionArgs);
                break;
            case COURSE_ITEM:
                String courseId = uri.getPathSegments().get(1);
                deletedRows = db.delete("Course", "id = ?", new String[]{courseId});
                break;
            default:
                break;
        }
        return deletedRows;
    }

    @Override
    public String getType(Uri uri) {
        switch (uriMatcher.match(uri)){
            case STUDENT_DIR:
                return "vnd:android.cursor.dir/vnd.com.tangliang.sqlitedatabase.provider.student";
            case STUDENT_ITEM:
                return "vnd:android.cursor.item/vnd.com.tangliang.sqlitedatabase.provider.student";
            case COURSE_DIR:
                return "vnd:android.cursor.dir/vnd.com.tangliang.sqlitedatabase.provider.course";
            case COURSE_ITEM:
                return "vnd:android.cursor.item/vnd.com.tangliang.sqlitedatabase.provider.course";
        }
        return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
       SQLiteDatabase db = dbHelper.getWritableDatabase();
        Uri uriReturn = null;
        switch (uriMatcher.match(uri)){
            case STUDENT_DIR:
            case STUDENT_ITEM:
                long newStudentId = db.insert("Student", null, values);
                uriReturn = Uri.parse("content://" + AUTHORITY + "/student/" + newStudentId);
                break;
            case COURSE_DIR:
            case COURSE_ITEM:
                long newCourseId = db.insert("Course", null, values);
                uriReturn = Uri.parse("content://" + AUTHORITY + "/course/" + newCourseId);
                break;
            default:
                break;
        }
        return uriReturn;
    }

    @Override
    public boolean onCreate() {
        dbHelper = new MyDatabaseHelper(getContext(), "Student.db", null, 2);
        return true;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        Cursor cursor = null;
        switch (uriMatcher.match(uri)){
            case STUDENT_DIR:
                cursor = db.query("Student", projection, selection, selectionArgs, null, null, sortOrder);
                break;
            case STUDENT_ITEM:
                String studentId = uri.getPathSegments().get(1);
                cursor = db.query("Student", projection, "id = ?", new String[]{ studentId }, null, null, sortOrder);
                break;
            case COURSE_DIR:
                cursor = db.query("Course", projection, selection, selectionArgs, null, null, sortOrder);
                break;
            case COURSE_ITEM:
                String courseId = uri.getPathSegments().get(1);
                cursor = db.query("Course", projection, "id = ?", new String[]{courseId}, null, null, sortOrder);
                break;
            default:
                break;
        }
        return cursor;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
                      String[] selectionArgs) {
       SQLiteDatabase db = dbHelper.getWritableDatabase();
        int updatedRows = 0;
        switch (uriMatcher.match(uri)){
            case STUDENT_DIR:
                updatedRows = db.update("Student", values, selection, selectionArgs);
                break;
            case STUDENT_ITEM:
                String studentId = uri.getPathSegments().get(1);
                updatedRows = db.update("Student", values, "id = ?", new String[]{ studentId });
                break;
            case COURSE_DIR:
                updatedRows = db.update("Course", values, selection, selectionArgs);
                break;
            case COURSE_ITEM:
                String courseId = uri.getPathSegments().get(1);
                updatedRows = db.update("Course", values, "id = ?", new String[] {courseId});
                break;
            default:
                break;
        }
        return updatedRows;
    }
}

MainActivity中的代码如下:

package com.tangliang.sqlitedatabase;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v4.app.NotificationCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    private MyDatabaseHelper myDatabaseHelper;

    private Button createDatabase;

    private Button addData;

    private Button updateData;

    private Button deleteData;

    private Button queryData;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myDatabaseHelper = new MyDatabaseHelper(this, "Student.db", null, 2);
        createDatabase = (Button) findViewById(R.id.createDatabase);
        addData = (Button) findViewById(R.id.addData);
        updateData = (Button) findViewById(R.id.updateData);
        deleteData = (Button) findViewById(R.id.deleteData);
        queryData = (Button) findViewById(R.id.queryData);
        createDatabase.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                myDatabaseHelper.getWritableDatabase();
            }
        });
        addData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();
                ContentValues values = new ContentValues();
                values.put("name", "tangliang");
                values.put("age", 21);
                db.insert("Student", null, values);
                values.clear();
            }
        });
        updateData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();
                ContentValues values = new ContentValues();
                values.put("age", 18);
                db.update("Student", values, "name = ?", new String[] {"tangliang"});
            }
        });
        deleteData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();
                db.delete("Student", "name = ?", new String[]{"tangliang"});
            }
        });
        queryData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();
                Cursor cursor = db.query("Student", null, null, null, null, null, null);
                if(cursor.moveToFirst()){
                    do{
                        String name = cursor.getString(cursor.getColumnIndex("name"));
                        int age = cursor.getInt(cursor.getColumnIndex("age"));
                        Log.d("MainActivity", "My name is " + name);
                        Log.d("MainActivity", "I'm " + age + " years old");
                    }
                    while(cursor.moveToNext());
                }
                cursor.close();
           }
        });
    }
}

这样暴露数据给其他程序的程序就写好了,接下来写个StudentProviderTest程序进行测试

activity_main.xml中的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/addData"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Add To Student"/>

</LinearLayout>

MainActivity中的代码如下:

package com.tangliang.studentprovidertest;

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

public class MainActivity extends AppCompatActivity {

    private String newId;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button addData = (Button) findViewById(R.id.addData);
        addData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Uri uri = Uri.parse("content://com.tangliang.sqlitedatabase.provider/student");
                ContentValues values = new ContentValues();
                values.put("name", "tangliang1");
                values.put("age", 23);
                Uri newUri = getContentResolver().insert(uri, values);
                newId = newUri.getPathSegments().get(1);
            }
        });
    }
}

这里只测试了添加数据,其他操作也是类似的方法


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值