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");
}
}
}
}