0
点赞
收藏
分享

微信扫一扫

ContentProvider跨进程通信

田妞的读书笔记 2022-03-16 阅读 93

A进程插入数据到数据库,步骤如下

1.创建数据库表:

package com.example.demoa

import android.content.Context
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper


private const val DB_NAME ="weather_provider.db"

const val TABLE_NAME ="weather"

private const val DB_VERSION = 1

private const val CREATE_TABLE =
    "create table if not exists $TABLE_NAME(_id integer primary key,city TEXT, weather TEXT, weather_id TEXT, temperature TEXT)";

class DbHelper(mContext: Context?) : SQLiteOpenHelper(mContext, DB_NAME, null, DB_VERSION) {

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

    override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
        TODO("Not yet implemented")
    }

}

2.创建ContentProvider:

package com.example.demoa

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

const val AUTHORITY = "com.example.demoa.WeatherProvider"

class WeatherProvider  : ContentProvider() {

    private lateinit var mdb : SQLiteDatabase

    init{
        val uriMatcher = UriMatcher(UriMatcher.NO_MATCH)
        uriMatcher.addURI(AUTHORITY, "weather", 0)
    }

    override fun onCreate(): Boolean {
        mdb = DbHelper(context).writableDatabase
        return false
    }

    override fun query(
        uri: Uri,
        projection: Array<out String>?,
        selection: String?,
        selectionArgs: Array<out String>?,
        sortOrder: String?
    ): Cursor? {
        return mdb.query(TABLE_NAME, projection, selection, selectionArgs, null, sortOrder, null)
    }

    override fun getType(uri: Uri): String? {
        return null
    }

    override fun insert(uri: Uri, values: ContentValues?): Uri? {
        mdb.insert(TABLE_NAME, null, values)
        context?.contentResolver?.notifyChange(uri, null)
        return null
    }

    override fun delete(uri: Uri, selection: String?, selectionArgs: Array<out String>?): Int {
        val num : Int = mdb.delete(TABLE_NAME, selection, selectionArgs)
        context?.contentResolver?.notifyChange(uri, null)
        return num
    }

    override fun update(
        uri: Uri,
        values: ContentValues?,
        selection: String?,
        selectionArgs: Array<out String>?
    ): Int {
        return 0
    }
}

3.插入数据:

package com.example.demoa

import android.content.ContentValues
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    fun updateData(view: View) {
        val uri = Uri.parse("content://$AUTHORITY")
        var contentValues = ContentValues()
        contentValues.put("city", "Shenzhen")
        contentValues.put("weather_id", "2033432")
        contentValues.put("temperature", "26")
        view.context.contentResolver.delete(uri, null, null)
        view.context.contentResolver.insert(uri, contentValues)
    }

}

4.别忘了在AndroidManifest.xml中注册ContentProvider:

<provider
    android:name="com.example.demoa.WeatherProvider"
    android:authorities="com.example.demoa.WeatherProvider"
    android:exported="true">
</provider>

5.执行完updateData()后,数据就已经插入到数据库了

下面我们通过adb查看插入的数据

(1)cd到/data/data/com.example.demoa/databases目录下,ls可以看到weather_provider.db,但此时执行sqlite3 weather_provider.db报错unable to open database
(2)执行chmod 777 weather_provider.db
(3)执行sqlite3 weather_provider.db
(4).tables,可以看到所有的数据库表
(5)select * from weather;注意最后的;不能省略,否则没有执行。执行完这条语句之后就可以看到数据了:1|Shenzhen||2033432|26

B进程取数据

package com.android.demob

import android.net.Uri
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity


class MainActivity : AppCompatActivity() {

    private val TAG = MainActivity::class.simpleName

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        getInfo()
    }

    private fun getInfo(){
        val mUri = Uri.parse("content://com.example.demoa.WeatherProvider")
        val cursor = this.contentResolver.query(mUri, null, null, null, null)
        if (cursor != null) {
            while (cursor.moveToNext()) {
                val city: String = cursor.getString(1)
                val weather_id: String = cursor.getString(3)
                val temperature: String = cursor.getString(4)
                Log.d(TAG, "$city<>$weather_id<>$temperature");
            }
        }
    }

}
举报

相关推荐

0 条评论