简介:

主要用于在不同的应用程序之间实现数据共享的功能,他提供了一套完整的机制,允许一个程序访问另一个程序中的数据 ,同时还能保证被访问数据的安全性。使用内容提供其是Android实现跨程序共享数据的标准方式。

Layout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.tiger.databasetest.MainActivity">

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

    <Button
        android:id="@+id/btn_add"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btn_create"
        android:onClick="onClickMainActivity"
        android:text="Add"
        android:textAllCaps="false" />
    <Button
        android:id="@+id/btn_del"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btn_add"
        android:onClick="onClickMainActivity"
        android:text="Delete"
        android:textAllCaps="false" />
    <Button
        android:id="@+id/btn_update"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btn_del"
        android:onClick="onClickMainActivity"
        android:text="Update"
        android:textAllCaps="false" />
    <Button
        android:id="@+id/btn_query"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btn_update"
        android:onClick="onClickMainActivity"
        android:text="Query"
        android:textAllCaps="false" />
</RelativeLayout>

清单文件

<provider
    android:name=".DatabaseProvider"
    android:authorities="com.tiger.databasetest.provider"
    android:enabled="true"
    android:exported="true"></provider>

DataBaseProvider

package com.tiger.databasetest;

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 DatabaseProvider extends ContentProvider {
    public DatabaseProvider() {
    }

    public static final int Users_Dir = 0;   //所有数据
    public static final int Users_ITEM = 1;  //单条数据
    public static final String AUTHORITY = "com.tiger.databasetest.provider"; //内容提供器的名称

    private static UriMatcher uriMatcher;
    private MyDatabaseHelper dbHelper; //数据库

    static {
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        uriMatcher.addURI(AUTHORITY, "Users", Users_Dir);
        uriMatcher.addURI(AUTHORITY, "Users/#", Users_ITEM);
    }

    @Override
    public boolean onCreate() {
        dbHelper = new MyDatabaseHelper(getContext(), "Test.db", null, 1);
        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 Users_Dir:
                cursor = db.query("Users", projection, selection, selectionArgs, null, null, sortOrder);
                break;
            case Users_ITEM:
                //getPathSegments()方法会把内容的URI权限之后的部分已 “/” 分割,并把分割后的结果放入到
                //一个字符创列表中,这个列表的地0位置存放的是路径,第1个位置存放的是 id
                //得到id 之后,就可以通过 selection 和 selectionArgs 参数进行约束,及时实现了查询单挑数据的功能。
                String userId = uri.getPathSegments().get(1);
                cursor = db.query("Users", projection, "id=?", new String[]{userId}, null, null, sortOrder);
                break;
        }
        return cursor;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        //添加数据
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        Uri uriReturn = null;
        switch (uriMatcher.match(uri)) {
            case Users_Dir:
            case Users_ITEM:
                long newUserId = db.insert("Users", null, values);
                uriReturn = Uri.parse("content://" + AUTHORITY + "/Users/" + newUserId);
                break;
        }
        return uriReturn;

    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
                      String[] selectionArgs) {
        //更新数据
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        int updateRows = 0;
        switch (uriMatcher.match(uri)) {
            case Users_Dir:
                updateRows = db.update("Users", values, selection, selectionArgs);
                break;
            case Users_ITEM:
                String userId = uri.getPathSegments().get(1);
                updateRows = db.update("Users", values, "id=?", new String[]{userId});
                break;
        }
        return updateRows;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        //删除数据
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        int deleteRows = 0;
        switch (uriMatcher.match(uri)) {
            case Users_Dir:
                deleteRows = db.delete("Users", selection, selectionArgs);
                break;
            case Users_ITEM:
                String userId = uri.getPathSegments().get(1);
                deleteRows = db.delete("Users", "id=?", new String[]{userId});
                break;
        }
        return deleteRows;
    }

    @Override
    public String getType(Uri uri) {
        switch (uriMatcher.match(uri)) {
            case Users_Dir:
                return "vnd.android.cursor.dir/vnd.com.tiger.databasetest.provider.Users";
            case Users_ITEM:
                return "vnd.android.cursor.item/vnd.com.tiger.databasetest.provider.Users";
        }
        return null;
    }
}

MainActivity

package com.tiger.databasetest;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    private MyDatabaseHelper dbHelper;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        dbHelper=new MyDatabaseHelper(MainActivity.this,"Test.db",null,1);

    }

    public  void onClickMainActivity(View view){
        switch (view.getId()){
            case R.id.btn_create: //创建数据库
                dbHelper.getWritableDatabase();
                break;
            case R.id.btn_add:
                SQLiteDatabase dbAdd=dbHelper.getWritableDatabase();
                dbAdd.execSQL("insert into Users(Name,Phone) values(?,?)",new String[]{"Name1","123123"});
                dbAdd.execSQL("insert into Users(Name,Phone) values(?,?)",new String[]{"Name2","123123"});
                break;
            case R.id.btn_del:
                SQLiteDatabase dbDel=dbHelper.getWritableDatabase();
                dbDel.execSQL("delete from Users where Id=?",new String[]{"2"});
                break;
            case R.id.btn_update:
                SQLiteDatabase dbUpdate=dbHelper.getWritableDatabase();
                dbUpdate.execSQL("update Users set phone=? where id=?",new String[]{"666666","1"});
                break;
            case R.id.btn_query:
                SQLiteDatabase dbQuery=dbHelper.getWritableDatabase();
                Cursor cursor = dbQuery.rawQuery("select * from Users",null);
                while (cursor.moveToNext()){
                    Log.e("Test ", "Id:"+cursor.getString(cursor.getColumnIndex("Id")) );
                    Log.e("Test ", "Name:"+cursor.getString(cursor.getColumnIndex("Name")) );
                    Log.e("Test ", "Phone:"+cursor.getString(cursor.getColumnIndex("Phone")) );
                }

                break;
        }
    }

}

MyDataBaseAdapter

package com.tiger.databasetest;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
 * Created by IT on 7/18/2017.
 */
public class MyDatabaseHelper extends SQLiteOpenHelper {
    public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL("create table Users(Id integer primary key autoincrement, Name text,Phone text)");
    }
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
    }
}

=========================================================================================================

ProviderTest

Layout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.tiger.providertest.MainActivity">

    <Button
        android:id="@+id/btn_query"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onClickMainActivity"
        android:text="Query"
        android:textAllCaps="false" />

    <Button
        android:id="@+id/btn_add"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/btn_query"
        android:onClick="onClickMainActivity"
        android:text="Add Data"
        android:textAllCaps="false" />

    <Button
        android:id="@+id/btn_update"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btn_add"
        android:onClick="onClickMainActivity"
        android:text="Update"
        android:textAllCaps="false" />

    <Button
        android:id="@+id/btn_delete"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btn_update"
        android:onClick="onClickMainActivity"
        android:text="Delete"
        android:textAllCaps="false" />
</RelativeLayout>

MainActivity

package com.tiger.providertest;

import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    private String newId="0"; //先添加记录的Id

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    public void onClickMainActivity(View view) {
        switch (view.getId()) {
            case R.id.btn_query: //查询数据
                Uri uriQuery = Uri.parse("content://com.tiger.databasetest.provider/Users");
                Cursor cursor = getContentResolver().query(uriQuery, null, null, null, null);
                if(cursor!=null){
                    while (cursor.moveToNext()) {
                        final String id=cursor.getString(cursor.getColumnIndex("Id"));
                        final String name=cursor.getString(cursor.getColumnIndex("Name"));
                        final String phone=cursor.getString(cursor.getColumnIndex("Phone"));

                        Log.e("Test ", "Id:" +id );
                        Log.e("Test ", "Name:" +name);
                        Log.e("Test ", "Phone:" + phone);
                    }
                    cursor.close();
                }
                break;
            case R.id.btn_add: //添加数据
                Uri uriAdd = Uri.parse("content://com.tiger.databasetest.provider/Users");
                ContentValues valuesAdd = new ContentValues();
                valuesAdd.put("Name", "TestName");
                valuesAdd.put("Phone", "88888888");
                Uri newUri = getContentResolver().insert(uriAdd, valuesAdd);
                newId = newUri.getPathSegments().get(1);
                Log.e("Test:", "The new insert data id:" + newId);
                break;
            case R.id.btn_update: //修改数据
                                                    //更新Users表中 最新添加的那条数据
                Uri uriUpdate=Uri.parse("content://com.tiger.databasetest.provider/Users/"+newId);
                ContentValues valuesUpdate= new ContentValues();
                valuesUpdate.put("Phone","666666");
                valuesUpdate.put("Name","Test2Name");
                getContentResolver().update(uriUpdate,valuesUpdate,null,null);
                break;
            case R.id.btn_delete: //删除数据
                Uri uriDel=Uri.parse("content://com.tiger.databasetest.provider/Users/"+newId);
                getContentResolver().delete(uriDel,null,null);
                break;
        }

    }

}
Last modification:July 12th, 2020 at 07:52 pm