【Android】コンテンツプロバイダーの使い方

1.コンテンツプロバイダーとは

  • アプリケーション間でデータを共有する方法
  • データを保存および取得するための統一されたインターフェイスを提供します
  • Androidは、いくつかの一般的なデータにデフォルトのContentProviderを提供します
  • ウリ紹介:操作するデータ表現

2.最小限のフォーム

import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

public class TestContentProvider extends ContentProvider {
    
    
    @Override
    public boolean onCreate() {
    
    
        return false;
    }

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

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

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
    
    
        return null;
    }

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

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

3.実際に実現する

  1. データベース
  2. 嫌い
  3. UriMatcher
  4. ContentProvider
  5. クエリ/挿入/更新/削除
  6. AndroidManifest.xml

1.最初にDatabaseHelper.javaにテーブルを作成します。

db.execSQL("create table " + BOOK_TABLE_NAME + "(" + BOOK_NAME + " varchar(20) not null, " + BOOK_PRICE + " varchar(10) not null);");

2.プロバイダーフォルダーを作成し、新しいURIList.javaを作成します。

package com.xx.aboutactivity.provider;

import com.xx.aboutactivity.database.DatabaseHelper;

public class URIList {
    
    
    public static final String CONTENT = "content://";
    public static final String AUTHORITY = "com.jsc4.aboutactivity";//包名
    public static final String USER_URI = CONTENT + AUTHORITY + "/" + DatabaseHelper.USER_TABLE_NAME;
    public static final String BOOK_URI = CONTENT + AUTHORITY + "/" + DatabaseHelper.BOOK_TABLE_NAME;
}

3.TestContentProvider.javaを作成します。

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.net.Uri;
import android.text.TextUtils;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.jsc4.aboutactivity.database.DatabaseHelper;

public class TestContentProvider extends ContentProvider {
    
    

    private static UriMatcher sUriMatcher;
    public static final int URI_MATCH_USER = 1;
    public static final int URI_MATCH_BOOK = 2;

    static {
    
    
        sUriMatcher  = new UriMatcher(UriMatcher.NO_MATCH);

        // content://com.jsc4.aboutactivity/user
        // content://com.jsc4.aboutactivity/book
        sUriMatcher.addURI(URIList.AUTHORITY, DatabaseHelper.USER_TABLE_NAME, URI_MATCH_USER);
        sUriMatcher.addURI(URIList.AUTHORITY, DatabaseHelper.USER_TABLE_NAME, URI_MATCH_BOOK);
    }

    DatabaseHelper mDatabaseHelper;

    @Override
    public boolean onCreate() {
    
    
        mDatabaseHelper = new DatabaseHelper(getContext());
        return false;
    }

    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
    
    

        // 知道用户在调用哪张表
        String tableName = getTabName(uri);
        if(TextUtils.isEmpty(tableName)){
    
    
            return null;
        }

        Cursor cursor = mDatabaseHelper.getReadableDatabase()
                .query(tableName, projection, selection, selectionArgs, null, null, sortOrder);
        return cursor;
    }

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

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
    
    
        String tableName = getTabName(uri);
        if(TextUtils.isEmpty(tableName)){
    
    
            return null;
        }
        return null;
    }

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

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

    private String getTabName(Uri uri){
    
    
        int type = sUriMatcher.match(uri);
        String tableName = null;
        switch (type){
    
    
            case URI_MATCH_USER:
                tableName = DatabaseHelper.USER_TABLE_NAME;
                break;
            case URI_MATCH_BOOK:
                tableName = DatabaseHelper.BOOK_TABLE_NAME;
                break;
        }
        return tableName;
    }
}

4. DatabaseButtonActivity.javaを呼び出します。

ContentResolver contentResolver = getContentResolver();

// 这里拿着uri去找
contentResolver.query(Uri.parse(URIList.USER_URI), null, null, null, null);//content://com.jsc4.aboutactivity/user

全文は次のとおりです。

import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.jsc4.aboutactivity.database.DatabaseHelper;
import com.jsc4.aboutactivity.provider.URIList;

public class DatabaseButtonActivity extends AppCompatActivity {
    
    

    SQLiteDatabase mSqLiteDatabase;

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

        DatabaseHelper databaseHelper = new DatabaseHelper(this);
        mSqLiteDatabase = databaseHelper.getWritableDatabase();

        // Insert
        findViewById(R.id.database_add_button).setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View v) {
    
    
                // IO操作,建议后台操作
                // 拼装成contentValues
                ContentValues contentValues = new ContentValues();
                contentValues.put(DatabaseHelper.USERNAME, "miamia");
                contentValues.put(DatabaseHelper.AGE, "13");

                // 判断插入是否成功
                long row =  mSqLiteDatabase.insert(DatabaseHelper.USER_TABLE_NAME, null, contentValues);
                Log.i("djtest", "onClick: row="+row);
                if(row != -1) {
    
    
                    Toast.makeText(DatabaseButtonActivity.this, "插入成功!", Toast.LENGTH_SHORT).show();
                }

                // query
                Cursor cursor = mSqLiteDatabase.query(DatabaseHelper.USER_TABLE_NAME, null, null, null, null, null, null);
                if(cursor.moveToFirst()) {
    
    
                    int count = cursor.getCount();
                    for (int i = 0; i < count; i++) {
    
    
                        String userName = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.USERNAME));
                        String age = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.AGE));
                        Log.i("djtest",i + " : " + userName + " | " + age + ".");
                    }
                }
            }
        });

        findViewById(R.id.database_delete_button).setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View v) {
    
    
                // delete
                String whereClauseString = "username=?";
                String[] whereArgs = {
    
    "miamia"};
                mSqLiteDatabase.delete(DatabaseHelper.USER_TABLE_NAME, whereClauseString, whereArgs);
            }
        });

        findViewById(R.id.database_update_button).setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View v) {
    
    
                // update
                // 当字段username=miamia时,将age更新为18
                ContentValues contentValues = new ContentValues();
                contentValues.put(DatabaseHelper.AGE, "18");
                String whereClauseString = "username=?";
                String[] whereArgs = {
    
    "miamia"};
                mSqLiteDatabase.update(DatabaseHelper.USER_TABLE_NAME, contentValues, whereClauseString, whereArgs);
            }
        });

        findViewById(R.id.database_transactions_button).setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View v) {
    
    
                mSqLiteDatabase.beginTransaction();//开始事务,此时数据库会被锁定
                try {
    
    
                    // 做你的操作
                    for (int i = 0; i < 1000; i++) {
    
    
                        mSqLiteDatabase.execSQL("insert into user(username, age) values ('miamia', '5岁')");
                    }
                    mSqLiteDatabase.setTransactionSuccessful();//设置事务已经成功,否则自动回滚不提交
                } catch (Exception e) {
    
    
                    e.printStackTrace();
                } finally {
    
    
                    mSqLiteDatabase.endTransaction();//提交并关闭事务
                }

                ContentResolver contentResolver = getContentResolver();

                // 这里拿着uri去找
                contentResolver.query(Uri.parse(URIList.USER_URI), null, null, null, null);//content://com.jsc4.aboutactivity/user
            }
        });
    }
}

5.AndroidManifest.xmlに登録します。

 <application>
	<provider
      	android:authorities="com.jsc4.aboutactivity"
        android:name=".provider.TestContentProvider"/>
 </application>

おすすめ

転載: blog.csdn.net/qq_30885821/article/details/108907870
おすすめ