简单步骤:Android studio 内容观察者 - 实现数据变化监测
提示:本篇文章將會盡量保持精簡,附加圖文解釋,焦躁是敲寫代碼最大的敵人,三連是最大的支持!
文章目錄
前言
一、項目介紹
二、使用步驟
1.創建第一個程序
2.導入圖片
3.放置界面控件
? ? ? ? ?4.創建數據庫
5.創建內容提供者
6.實現界面交互
7.創建第二個程序
8.運行程序
總結
前言
本篇文章將會介紹如何使用?Android studio “內容觀察者”,實現 “監測數據變化” 。文章盡量保持精簡,并帶有圖文解釋,努力讓各位讀者擁有更佳的觀看體驗。項目包括了前篇中的 “內容提供者” 的內容,如果對 “內容提供者”?的項目實施并不是很熟悉,可以先移步到另一篇文章?簡單步驟:Android studio 內容提供者 - 實現讀取手機通訊錄_蛇形刁手的博客-CSDN博客
一、項目介紹
首先在這里不會過多的贅述 “ 內容觀察者 ” 的具體知識點,著重介紹如何在 Android studio 中使用 “ 內容觀察者 ” 去監測數據庫中的數據,因此在該項目中需要創建兩個程序去實現項目效果。一個實現對數據庫中的數據進行操作,另一個用來監測數據庫中的數據是否變化。
二、使用步驟
1.創建第一個程序
創建第一個程序命名為 ContentObserverDB , 指定包名為 com.itcast.contentobserverdb 。
2.導入圖片
圖片分別命名為 bg.png 和 btn_bg.png? (無水印),當然也可使用自己的圖片(要注意修改代碼中的圖片名稱)
?3.放置界面控件
由于我們要建立一個操作數據庫的界面,所以需要在 res/layout 文件夾中的 activity_main.xml 文件中放置四個 Button 按鈕控件,分別表示 “添加” 、“更新” 、“刪除” 、“查詢” 。
?代碼如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/bg"android:orientation="vertical"><Buttonandroid:id="@+id/btn_insert"android:layout_width="120dp"android:layout_height="40dp"android:layout_marginLeft="40dp"android:layout_marginTop="30dp"android:background="@drawable/btn_bg"android:text="添加"android:textColor="#006000"android:textSize="20dp" /><Buttonandroid:id="@+id/btn_update"android:layout_width="120dp"android:layout_height="40dp"android:layout_marginLeft="80dp"android:layout_marginTop="30dp"android:background="@drawable/btn_bg"android:text="更新"android:textColor="#006000"android:textSize="20dp" /><Buttonandroid:id="@+id/btn_delete"android:layout_width="120dp"android:layout_height="40dp"android:layout_marginLeft="120dp"android:layout_marginTop="30dp"android:background="@drawable/btn_bg"android:text="刪除"android:textColor="#006000"android:textSize="20dp" /><Buttonandroid:id="@+id/btn_select"android:layout_width="120dp"android:layout_height="40dp"android:layout_marginLeft="160dp"android:layout_marginTop="30dp"android:background="@drawable/btn_bg"android:text="查詢"android:textColor="#006000"android:textSize="20dp" /> </LinearLayout>4.創建數據庫
顯而易見我們要實現監測數據變化,自然要創建一個數據庫。所以我們需要在 com.itcast.contentobserverdb 包下新建一個命名為 PersonDBOpenHelper 的java類,來繼承 SQLiteOpenHelper 類。
代碼如下:?
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.itcast.contentobserverdb"><applicationandroid: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.ContentObserverDB"><providerandroid:name=".PersonProvider"android:authorities="com.itcast.contentobserverdb"android:enabled="true"android:exported="true"></provider><activityandroid:name=".MainActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>5.創建內容提供者
選擇程序中的 com.itcast.contentobserverdb 包,單擊鼠標右鍵,選擇 【New】-> 【Other】-> 【Content Provide】選項,創建一個內容提供者命名為 PersonProvider 。
代碼如下:
package com.itcast.contentobserverdb;import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri;public class PersonProvider extends ContentProvider {private static UriMatcher mUriMatcher = new UriMatcher(-1);private static final int SUCCESS = 1;private PersonDBOpenHelper helper;static {mUriMatcher.addURI("com.itcast.contentobserverdb", "info", SUCCESS);}@Overridepublic boolean onCreate() {helper = new PersonDBOpenHelper(getContext());return false;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {int code = mUriMatcher.match(uri);if (code == SUCCESS) {SQLiteDatabase db = helper.getReadableDatabase();return db.query("info", projection, selection, selectionArgs,null, null, sortOrder);} else {throw new IllegalArgumentException("路徑不正確,無法查詢數據!");}}@Overridepublic Uri insert(Uri uri, ContentValues values) {int code = mUriMatcher.match(uri);if (code == SUCCESS) {SQLiteDatabase db = helper.getReadableDatabase();long rowId = db.insert("info", null, values);if (rowId > 0) {Uri insertedUri = ContentUris.withAppendedId(uri, rowId);getContext().getContentResolver().notifyChange(insertedUri, null);return insertedUri;}db.close();return uri;} else {throw new IllegalArgumentException("路徑不正確,無法插入數據!");}}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {int code = mUriMatcher.match(uri);if (code == SUCCESS) {SQLiteDatabase db = helper.getWritableDatabase();int count = db.delete("info", selection, selectionArgs);if (count > 0) {getContext().getContentResolver().notifyChange(uri, null);}db.close();return count;} else {throw new IllegalArgumentException("路徑不正確,無法隨便刪除數據!");}}@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {int code = mUriMatcher.match(uri);if (code == SUCCESS) {SQLiteDatabase db = helper.getWritableDatabase();int count = db.update("info", values, selection, selectionArgs);if (count > 0) {getContext().getContentResolver().notifyChange(uri, null);}db.close();return count;} else {throw new IllegalArgumentException("路徑不正確,無法更新數據!");}}@Overridepublic String getType(Uri uri) {return null;} }6.實現界面交互
對上文中創建的操作界面中的四個 Button 按鈕控件在?java/com.itcast.contentobserverdb 文件夾下創建命名為 MainActivity 的Java類中去實現具體操作功能。同時需要注意創建程序后會自動生產一個名為?MainActivity 的 kt 類,這兩只是名字相同,不要搞混了。
?
代碼如下:
package com.itcast.contentobserverdb;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.appcompat.app.AppCompatActivity;import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random;public class MainActivity extends AppCompatActivity implementsView.OnClickListener {private ContentResolver resolver;private Uri uri;private ContentValues values;private Button btnInsert;private Button btnUpdate;private Button btnDelete;private Button btnSelect;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();createDB();}private void initView() {btnInsert = findViewById(R.id.btn_insert);btnUpdate = findViewById(R.id.btn_update);btnDelete = findViewById(R.id.btn_delete);btnSelect = findViewById(R.id.btn_select);btnInsert.setOnClickListener(this);btnUpdate.setOnClickListener(this);btnDelete.setOnClickListener(this);btnSelect.setOnClickListener(this);}private void createDB() {PersonDBOpenHelper helper = new PersonDBOpenHelper(this);SQLiteDatabase db = helper.getWritableDatabase();for (int i = 0; i < 3; i++) {ContentValues values = new ContentValues();values.put("name", "itcast" + i);db.insert("info", null, values);}db.close();}@Overridepublic void onClick(View v) {resolver = getContentResolver();uri = Uri.parse("content://com.itcast.contentobserverdb/info");values = new ContentValues();switch (v.getId()) {case R.id.btn_insert:Random random = new Random();values.put("name", "add_itcast" + random.nextInt(10));Uri newuri = resolver.insert(uri, values);Toast.makeText(this, "添加成功", Toast.LENGTH_SHORT).show();Log.i("數據庫應用", "添加");break;case R.id.btn_delete:int deleteCount = resolver.delete(uri, "name=?",new String[]{"itcast0"});Toast.makeText(this, "成功刪除了" + deleteCount + "行",Toast.LENGTH_SHORT).show();Log.i("數據庫應用", "刪除");break;case R.id.btn_select:List<Map<String, String>> data = new ArrayList<Map<String, String>>();Cursor cursor = resolver.query(uri, new String[]{"_id", "name"},null, null, null);while (cursor.moveToNext()) {Map<String, String> map = new HashMap<String, String>();map.put("_id", cursor.getString(0));map.put("name", cursor.getString(1));data.add(map);}cursor.close();Log.i("數據庫應用", "查詢結果:" + data.toString());break;case R.id.btn_update:values.put("name", "update_itcast");int updateCount = resolver.update(uri, values, "name=?",new String[]{"itcast1"});Toast.makeText(this, "成功更新了" + updateCount + "行",Toast.LENGTH_SHORT).show();Log.i("數據庫應用", "更新");break;}} }7.創建第二個程序
創建第二個程序,命名為 MonitorData ,指定包名為 com.itcast.monitordata ,由于我們只需要對數據庫的操作進行監測,所以就不需要再有主界面,我們可以直接 java/com.itcast.monitordata 文件夾下創建一個命名為 MainActivity 的java類,來注冊一個內容觀察者,觀察數據庫是否發生了變化。
代碼如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.itcast.monitordata"><applicationandroid: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.MonitorData"><activityandroid:name=".MainActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>8.運行程序
<1>.我們在運行程序時,先回到我們的第一個 ContentObserverDB 程序 打開虛擬機,進行運行。
<2>.然后我們可以打開 Device File Explorer 窗口中(在整個 Android studio 界面的右下角) 根據 【data】->【data】->【com.itcast.contentoberverfb】->【databases】?路徑查看系統是否已經生成了 數據庫文件 person.db 。
?<3>.我們再回到第二個?MonitorData 程序進行運行,然后在 ContentObserverDB 程序界面中分別點擊? “添加” 、“更新” 、“刪除” 、“查詢” 四個按鈕,這時界面下方就會出現反饋。
示例效果圖:
<4>.最后完成上訴操作后,我們可以點開 Logcat 窗口去查看輸出的 Log 信息。
總結
以上就是 Android studio 內容觀察者?- 實現數據變化監測的具體操作,由于每個人的配置、編寫習慣等等多種原因,如果在實際操作中出現問題,或者發現文章中的錯誤,也可以在評論區中發表出來,盡能所答,歡迎指點與建議。
編寫不易,關注、三連是最大的支持!!!
歡迎建議,感謝支持!!!
總結
以上是生活随笔為你收集整理的简单步骤:Android studio 内容观察者 - 实现数据变化监测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端之vue监测数据改变的原理
- 下一篇: 《计算机系统要素》 第六章 汇编编译器