Android 第二十九章 ContentProvider

一、继承

java.lang.Object
↳ android.content.ContentProvider

二、简介

ContentProvider:Android四大组件之一,暴露一些用于共享的数据

三、示例

获取通讯录中的手机号和用户名

    //权限 <uses-permission android:name="android.permission.READ_CONTACTS"/>
    private fun getPhone() {
        var uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
        var cursor = contentResolver.query(uri, null, null, null, null)
        if (null != cursor) {
            while (cursor.moveToNext()) {
                var phone = cursor.getString(cursor.getColumnIndex("data1"))
                var name = cursor.getString(cursor.getColumnIndex("display_name"))
                Log.d("name", "$phone/$name")
            }
        }
    }

添加手机号和用户到通讯录中

	// 权限    
	//<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
    //<uses-permission android:name="android.permission.WRITE_PROFILE"/>
    private fun setPhone() {
        val uri = Uri.parse("content://com.android.contacts/raw_contacts")
        val dataUri = Uri.parse("content://com.android.contacts/data")

        val operations = ArrayList<ContentProviderOperation>()
        val op1 = ContentProviderOperation.newInsert(uri)
            .withValue("account_name", null)
            .build()
        operations.add(op1)
        var cpo1 = ContentProviderOperation.newInsert(dataUri)
            .withValueBackReference("raw_contact_id", 0)
            .withValue("mimetype", "vnd.android.cursor.item/name")
            .withValue("data1", "小明")
            .build()
        operations.add(cpo1)
        var cpo2 = ContentProviderOperation.newInsert(dataUri)
            .withValueBackReference("raw_contact_id", 0)
            .withValue("mimetype", "vnd.android.cursor.item/phone_v2")
            .withValue("data1", "12345678912")
            .build()
        operations.add(cpo2)
        contentResolver.applyBatch("com.android.contacts", operations)
    }

四、自定义ContentProvider

class TestSQLiteOpenHelper(context: Context, name: String, version: Int) :
    SQLiteOpenHelper(context, name, null, version) {

    val book = "create table book(id integer primary key autoincrement," +
            "name text," +
            "price text)"

    override fun onCreate(db: SQLiteDatabase?) {
        db?.execSQL(book)
    }

    override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
    }
}
class TestContentProvider : ContentProvider() {

    private val uriMatcher = UriMatcher(UriMatcher.NO_MATCH)
    private lateinit var db: SQLiteDatabase
    private lateinit var testSQLiteOpenHelper: TestSQLiteOpenHelper

    init {
        uriMatcher.addURI("com.example.third.testcontentprovider", "book", 1)

    }

    override fun onCreate(): Boolean {
        testSQLiteOpenHelper = TestSQLiteOpenHelper(context!!, "book.db", 1)
        db = testSQLiteOpenHelper.readableDatabase
        return true
    }

    override fun insert(uri: Uri, values: ContentValues?): Uri? {
        when (uriMatcher.match(uri)) {
            1 -> {
                val rowId = db.insert("book", null, values)
                if (rowId > 0) {
                    val newUri = ContentUris.withAppendedId(uri, rowId);
                    context?.contentResolver?.notifyChange(newUri, null);
                    return newUri;
                }
            }
        }
        return null
    }

    override fun query(
        uri: Uri,
        projection: Array<String>?,
        selection: String?,
        selectionArgs: Array<String>?,
        sortOrder: String?
    ): Cursor? {


        when (uriMatcher.match(uri)) {
            1 -> {
                return db.query(
                    "book",
                    projection,
                    selection,
                    selectionArgs,
                    null,
                    null,
                    sortOrder
                )
            }
        }
        return null
    }

    override fun update(
        uri: Uri,
        values: ContentValues?,
        selection: String?,
        selectionArgs: Array<String>?
    ): Int {
        when (uriMatcher.match(uri)) {
            1 -> {
                val count = db.update("book", values, selection, selectionArgs)
                if (count > 0) {
                    context!!.contentResolver.notifyChange(uri, null)
                }
                return count
            }
        }
        return 0
    }

    override fun delete(uri: Uri, selection: String?, selectionArgs: Array<String>?): Int {
        when (uriMatcher.match(uri)) {
            1 -> {
                val count = db.delete("book", selection, selectionArgs)
                if (count > 0) {
                    context!!.contentResolver.notifyChange(uri, null)
                }
                return count
            }
        }
        return 0
    }

    override fun getType(uri: Uri): String? {
        return null
    }
}
/**   
	viewBinding{
  		enabled=true
	}
*/
class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)



        binding.btnTest.setOnClickListener {
            val values = ContentValues()
            values.put("name", "钢铁是怎样炼成的")
            values.put("price", "20")
            val uri: Uri = Uri.parse("content://com.example.third.testcontentprovider/book")
            contentResolver.insert(uri, values)
        }


        binding.btnQuery.setOnClickListener {
            val uri: Uri = Uri.parse("content://com.example.third.testcontentprovider/book")
            val cursor = contentResolver.query(uri, null, null, null, null)
            val sb=StringBuffer()
            if (cursor!!.moveToFirst()) {
                do {
                    val name = cursor.getString(cursor.getColumnIndex("name"))
                    val price = cursor.getString(cursor.getColumnIndex("price"))
                    sb.append("name: $name , price: $price")
                } while (cursor.moveToNext())
            }
            cursor.close()
            Log.d("data", sb.toString())
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn_query"
        android:layout_width="200dp"
        android:layout_height="80dp"
        android:text="查询"
        android:textSize="30sp" />

    <Button
        android:id="@+id/btn_test"
        android:layout_width="200dp"
        android:layout_height="80dp"
        android:text="测试"
        android:textSize="30sp" />

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

    <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/Theme.ThirdDemo">


        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <provider
            android:name="com.example.third.TestContentProvider"
            android:authorities="com.example.third.testcontentprovider"
            android:exported="true"
            tools:ignore="Instantiatable" />
    </application>

</manifest>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值