精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

HarmonyOS Sample之DataAbility RDB數(shù)據(jù)庫(kù)操作

數(shù)據(jù)庫(kù) 其他數(shù)據(jù)庫(kù) OpenHarmony
使用Data模板的Ability(以下簡(jiǎn)稱“Data”)有助于應(yīng)用管理其自身和其他應(yīng)用存儲(chǔ)數(shù)據(jù)的訪問(wèn),并提供與其他應(yīng)用共享數(shù)據(jù)的方法。

[[414085]]

想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

DataAbility RDB數(shù)據(jù)庫(kù)操作

介紹

使用Data模板的Ability(以下簡(jiǎn)稱“Data”)有助于應(yīng)用管理其自身和其他應(yīng)用存儲(chǔ)數(shù)據(jù)的訪問(wèn),并提供與其他應(yīng)用共享數(shù)據(jù)的方法。Data既可用于同設(shè)備不同應(yīng)用的數(shù)據(jù)共享,也支持跨設(shè)備不同應(yīng)用的數(shù)據(jù)共享。

數(shù)據(jù)的存放形式多樣,可以是數(shù)據(jù)庫(kù),也可以是磁盤(pán)上的文件。Data對(duì)外提供對(duì)數(shù)據(jù)的增、刪、改、查,以及打開(kāi)文件等接口,這些接口的具體實(shí)現(xiàn)由開(kāi)發(fā)者提供。

本示例演示了如何使用Data Ability對(duì)RDB數(shù)據(jù)庫(kù)進(jìn)行增、刪、改、查,以及讀取文本文件。

模仿手機(jī)的備忘錄,實(shí)現(xiàn)了簡(jiǎn)單的操作。

搭建環(huán)境

安裝DevEco Studio,詳情請(qǐng)參考DevEco Studio下載

設(shè)置DevEco Studio開(kāi)發(fā)環(huán)境,DevEco Studio開(kāi)發(fā)環(huán)境需要依賴于網(wǎng)絡(luò)環(huán)境,需要連接上網(wǎng)絡(luò)才能確保工具的正常使用,可以根據(jù)如下兩種情況來(lái)配置開(kāi)發(fā)環(huán)境:

如果可以直接訪問(wèn)Internet,只需進(jìn)行下載HarmonyOS SDK操作

如果網(wǎng)絡(luò)不能直接訪問(wèn)Internet,需要通過(guò)代理服務(wù)器才可以訪問(wèn),請(qǐng)參考配置開(kāi)發(fā)環(huán)境

步驟

1.創(chuàng)建一個(gè)DataAbility和數(shù)據(jù)庫(kù)常量類

a.創(chuàng)建一個(gè)Empty DataAbility

entity右鍵,New- Ability-Empty Data Ability,然后輸入名稱 NoteDataAbility

HarmonyOS Sample 之 DataAbility RDB數(shù)據(jù)庫(kù)操作-鴻蒙HarmonyOS技術(shù)社區(qū)

b.創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)常量類 Const.java

存放數(shù)據(jù)庫(kù)名稱、表名稱、字段列名稱、存儲(chǔ)路徑等

需要注意的是,

BASE_URI 3個(gè)杠后面的部分要和config.json Data Ability 聲明的uri完全一致,否則應(yīng)用無(wú)法啟動(dòng)

  1. /** 
  2.  * Const 
  3.  */ 
  4. public class Const { 
  5.     /** 
  6.      * DataAbility base uri 
  7.      * scheme:協(xié)議方案名,固定為“dataability”,代表Data Ability所使用的協(xié)議類型。 
  8.      * authority:設(shè)備ID。如果為跨設(shè)備場(chǎng)景,則為目標(biāo)設(shè)備的ID;如果為本地設(shè)備場(chǎng)景,則不需要填寫(xiě)。 
  9.      * path:資源的路徑信息,代表特定資源的位置信息。 
  10.      * query:查詢參數(shù)。 
  11.      * fragment:可以用于指示要訪問(wèn)的子資源。 
  12.      * 本地設(shè)備的“device_id”字段為空,因此在“dataability:”后面有三個(gè)“/” 
  13.      * 
  14.      * BASE_URI 3個(gè)杠后面的部分要和config.json  Data Ability 聲明的uri完全一致,否則應(yīng)用無(wú)法啟動(dòng) 
  15.      * 
  16.      */ 
  17.     public static final String BASE_URI = "dataability:///ohos.samples.dataability.NoteDataAbility"
  18.  
  19.     /** 
  20.      * Database name 
  21.      */ 
  22.     public static final String DB_NAME = "note.db"
  23.  
  24.     /** 
  25.      * Database table name 
  26.      */ 
  27.     public static final String DB_TAB_NAME = "note"
  28.  
  29.     /** 
  30.      * Database column name:Id 
  31.      */ 
  32.     public static final String DB_COLUMN_ID = "Id"
  33.     /** 
  34.      * Database column name:noteTitle 
  35.      */ 
  36.     public static final String DB_COLUMN_TITLE = "noteTitle"
  37.  
  38.     /** 
  39.      * Database column name:writeTime 
  40.      */ 
  41.     public static final String DB_COLUMN_TIME = "writeTime"
  42.  
  43.     /** 
  44.      * Database column name:noteCategory 
  45.      */ 
  46.     public static final String DB_COLUMN_CATEGORY = "noteCategory"
  47.     /** 
  48.      * Database column name:noteContent 
  49.      */ 
  50.     public static final String DB_COLUMN_CONTENT = "noteContent"
  51.  
  52.     /** 
  53.      * Database data path 
  54.      */ 
  55.     public static final String DATA_PATH = "/note"
  56.  
  57.  
  58.     /** 
  59.      * 文件名稱 
  60.      */ 
  61.     public static final String FILE_NAME = "userdataability.txt"
  62.  

c.config.json相關(guān)配置

config.json涉及NoteDataAbility.java 的地方有3處,

第1處在module對(duì)象下,

HarmonyOS Sample 之 DataAbility RDB數(shù)據(jù)庫(kù)操作-鴻蒙HarmonyOS技術(shù)社區(qū)

第2處是abilities對(duì)象下,

permissions表示其他應(yīng)用的能力調(diào)用當(dāng)前能力所需的權(quán)限。

默認(rèn)情況下隱藏"visible"字段(值為false),表示僅本應(yīng)用可訪問(wèn)該Data,開(kāi)發(fā)人員可根據(jù)需求修改permissions、visible值、uri等內(nèi)容。當(dāng)外部應(yīng)用需要訪問(wèn)/控制此數(shù)據(jù)庫(kù)字段時(shí),在該Data Ability配置中增加"visible": true,并在外面應(yīng)用的配置文件config.json中申請(qǐng)permissions權(quán)限。

HarmonyOS Sample 之 DataAbility RDB數(shù)據(jù)庫(kù)操作-鴻蒙HarmonyOS技術(shù)社區(qū)

第3處是reqPermissions對(duì)象下,

說(shuō)明:如果待訪問(wèn)的Data Ability是由本應(yīng)用創(chuàng)建,則可以不聲明該權(quán)限。

HarmonyOS Sample 之 DataAbility RDB數(shù)據(jù)庫(kù)操作-鴻蒙HarmonyOS技術(shù)社區(qū)

2.聲明數(shù)據(jù)庫(kù)存儲(chǔ)對(duì)象和數(shù)據(jù)庫(kù)配置

在NoteDataAbility.java 添加如下代碼

  1. //聲明數(shù)據(jù)庫(kù)存儲(chǔ)對(duì)象 
  2. private RdbStore rdbStore; 
  3. //數(shù)據(jù)庫(kù)配置,指定數(shù)據(jù)庫(kù)名稱 
  4. private StoreConfig storeConfig = StoreConfig.newDefaultConfig(Const.DB_NAME); 

3.實(shí)現(xiàn)打開(kāi)RDB數(shù)據(jù)庫(kù)回調(diào)函數(shù)

在NoteDataAbility.java 添加如下代碼

  1. // 管理數(shù)據(jù)庫(kù)創(chuàng)建、升級(jí)和降級(jí)。 
  2. // 您可以創(chuàng)建一個(gè)子類來(lái)實(shí)現(xiàn) #onCreate、#onUpgrade 或 #onOpen 方法。  
  3. // 如果一個(gè)數(shù)據(jù)庫(kù)已經(jīng)存在,它將被打開(kāi); 如果不存在數(shù)據(jù)庫(kù),則將創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)。  
  4. // 在數(shù)據(jù)庫(kù)升級(jí)過(guò)程中,也會(huì)調(diào)用該類的方法。 
  5. private RdbOpenCallback rdbOpenCallback = new RdbOpenCallback() { 
  6.     @Override 
  7.     public void onCreate(RdbStore rdbStore) { 
  8.         //創(chuàng)建表 
  9.         rdbStore.executeSql( 
  10.                 "create table if not exists " + Const.DB_TAB_NAME + "2 (" + 
  11.                         Const.DB_COLUMN_ID + " integer primary key autoincrement ," + 
  12.                         Const.DB_COLUMN_TITLE + " text not null," + 
  13.                         Const.DB_COLUMN_CONTENT + " text not null," + 
  14.                         Const.DB_COLUMN_TIME + " text not null," + 
  15.                         Const.DB_COLUMN_CATEGORY + " text not null" + 
  16.  
  17.                         ")" 
  18.         ); 
  19.     } 
  20.  
  21.     @Override 
  22.     public void onUpgrade(RdbStore rdbStore, int i, int i1) { 
  23.         //數(shù)據(jù)庫(kù)升級(jí) 
  24.     } 
  25. }; 

4.初始化RDB數(shù)據(jù)庫(kù)存儲(chǔ)對(duì)象

在NoteDataAbility.java 添加如下代碼

  1. @Override 
  2. public void onStart(Intent intent) { 
  3.     super.onStart(intent); 
  4.     HiLog.info(LABEL_LOG, "NoteDataAbility onStart"); 
  5.     //數(shù)據(jù)庫(kù)幫助類 
  6.     DatabaseHelper databaseHelper = new DatabaseHelper(this); 
  7.     //初始化RDB數(shù)據(jù)庫(kù)存儲(chǔ)對(duì)象 
  8.     rdbStore = databaseHelper.getRdbStore(storeConfig, 1, rdbOpenCallback); 
  9.  

5.實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的基本操作函數(shù)

NoteDataAbility.java操作數(shù)據(jù)庫(kù)的方法都需要自己實(shí)現(xiàn),包括:添加、修改、查詢、刪除,還有打開(kāi)文件,主要使用rdbStore對(duì)象。

  1. @Override 
  2. public ResultSet query(Uri uri, String[] columns, DataAbilityPredicates predicates) { 
  3.     HiLog.info(LABEL_LOG, "NoteDataAbility query"); 
  4.     RdbPredicates rdbPredicates = DataAbilityUtils.createRdbPredicates(predicates, Const.DB_TAB_NAME); 
  5.     return rdbStore.query(rdbPredicates, columns); 
  6.  
  7. @Override 
  8. public int insert(Uri uri, ValuesBucket value) { 
  9.     HiLog.info(LABEL_LOG, "NoteDataAbility insert"); 
  10.     //long to int 
  11.     int rowId = (int) rdbStore.insert(Const.DB_TAB_NAME, value); 
  12.     //通知觀察者數(shù)據(jù)發(fā)生變化 
  13.     DataAbilityHelper.creator(this).notifyChange(uri); 
  14.     return rowId; 
  15.  
  16. @Override 
  17. public int delete(Uri uri, DataAbilityPredicates predicates) { 
  18.     //rdb 條件,通過(guò)DataAbilityUtils將DataAbilityPredicates轉(zhuǎn)成 RdbPredicates 
  19.     RdbPredicates rdbPredicates = DataAbilityUtils.createRdbPredicates(predicates, Const.DB_TAB_NAME); 
  20.     //執(zhí)行刪除 
  21.     int rowId = rdbStore.delete(rdbPredicates); 
  22.     HiLog.info(LABEL_LOG, "%{public}s""delete"); 
  23.     //通知觀察者數(shù)據(jù)發(fā)生變化 
  24.     DataAbilityHelper.creator(this).notifyChange(uri); 
  25.     return rowId; 
  26.  
  27. @Override 
  28. public int update(Uri uri, ValuesBucket value, DataAbilityPredicates predicates) { 
  29.     //rdb 條件,通過(guò)DataAbilityUtils將DataAbilityPredicates轉(zhuǎn)成 RdbPredicates 
  30.     RdbPredicates rdbPredicates = DataAbilityUtils.createRdbPredicates(predicates, Const.DB_TAB_NAME); 
  31.     int rowId =rdbStore.update(value, rdbPredicates); 
  32.     //通知觀察者數(shù)據(jù)發(fā)生變化 
  33.     DataAbilityHelper.creator(this).notifyChange(uri); 
  34.     return rowId; 
  35.  
  36. @Override 
  37. public FileDescriptor openFile(Uri uri, String mode) { 
  38.  
  39.     //獲取應(yīng)用程序在設(shè)備內(nèi)部存儲(chǔ)器上存放文件的目錄 
  40.     File file = new File(getFilesDir(), uri.getDecodedQuery()); 
  41.  
  42.     FileDescriptor fileDescriptor = null
  43.     try { 
  44.         FileInputStream fis = new FileInputStream(file); 
  45.         //獲取FD 
  46.         fileDescriptor = fis.getFD(); 
  47.         //獲取一個(gè)新的文件描述符,它是現(xiàn)有文件描述符的副本 
  48.         return MessageParcel.dupFileDescriptor(fileDescriptor); 
  49.     } catch (IOException e) { 
  50.         e.printStackTrace(); 
  51.     } 
  52.     return fileDescriptor; 

6.數(shù)據(jù)的訂閱和通知

在NoteDataAbility.java 中, 我們看到insert/update/delete方法都有一行。

  1. DataAbilityHelper.creator(this).notifyChange(uri); 

目的是在數(shù)據(jù)庫(kù)數(shù)據(jù)發(fā)生變化時(shí),通知數(shù)據(jù)的訂閱者。

而在MainAbilitySlice.java 類中有如下方法,在OnStart()中被調(diào)用,實(shí)現(xiàn)了數(shù)據(jù)變化的訂閱。

  1. private void initDatabaseHelper() { 
  2.     //創(chuàng)建實(shí)例 
  3.     dataAbilityHelper = DataAbilityHelper.creator(this); 
  4.     //注冊(cè)一個(gè)觀察者來(lái)觀察給定 Uri 指定的數(shù)據(jù),dataObserver表示 IDataAbilityObserver 對(duì)象 
  5.     dataAbilityHelper.registerObserver(Uri.parse(Const.BASE_URI), dataAbilityObserver); 

同時(shí),數(shù)據(jù)變化訂閱方還需要實(shí)現(xiàn)IDataAbilityObserver接口,在數(shù)據(jù)變化時(shí)會(huì)自動(dòng)回調(diào),完成對(duì)應(yīng)的邏輯處理。

  1. //觀察者模式,數(shù)據(jù)變化時(shí)回調(diào) 
  2. private final IDataAbilityObserver dataAbilityObserver=() -> { 
  3.     HiLog.info(LABEL, "%{public}s""database changed"); 
  4.     //篩選數(shù)據(jù) 
  5.     initLists(this); 
  6. }; 

當(dāng)數(shù)據(jù)訂閱者不再需要訂閱Data變化時(shí),則調(diào)用unregisterObserver​(Uri uri, IDataAbilityObserver dataObserver)方法取消。

  1. @Override 
  2. protected void onStop() { 
  3.     super.onStop(); 
  4.     dataAbilityHelper.unregisterObserver(Uri.parse(Const.BASE_URI), dataAbilityObserver); 

觀察者模式的作用在于當(dāng)數(shù)據(jù)庫(kù)表格的內(nèi)容產(chǎn)生變化時(shí),可以主動(dòng)通知與該表格數(shù)據(jù)相關(guān)聯(lián)的進(jìn)程或者應(yīng)用,從而使得相關(guān)進(jìn)程或者應(yīng)用接收到數(shù)據(jù)變化后完成相應(yīng)的處理。

7.訪問(wèn)Data Ability,新建AddNoteAbility,在AddNoteAbilitySlice實(shí)現(xiàn)數(shù)據(jù)的添加和修改

開(kāi)發(fā)者可以通過(guò)DataAbilityHelper類來(lái)訪問(wèn)當(dāng)前應(yīng)用或其他應(yīng)用提供的共享數(shù)據(jù)。

DataAbilityHelper作為客戶端,與提供方的Data進(jìn)行通信。DataAbilityHelper提供了一系列與Data Ability通信的方法。

a.數(shù)據(jù)的添加

  1. /** 
  2.  * 保存數(shù)據(jù) 
  3.  * 
  4.  * @param component component 
  5.  */ 
  6. private void saveNote(Component component) { 
  7.     ValuesBucket valuesBucket = new ValuesBucket(); 
  8.     TextField noteTitle = (TextField) findComponentById(ResourceTable.Id_add_note_title); 
  9.     if (noteTitle.getText().isEmpty()) { 
  10.         DialLogUtils dialog = new DialLogUtils(this, "標(biāo)題不能為空!"); 
  11.         dialog.showDialog(); 
  12.         return
  13.     } 
  14.     TextField noteContent = (TextField) findComponentById(ResourceTable.Id_add_note_content); 
  15.     if (noteContent.getText().isEmpty()) { 
  16.         DialLogUtils dialog = new DialLogUtils(this, "內(nèi)容不能為空!"); 
  17.         dialog.showDialog(); 
  18.         return
  19.     } 
  20.     Text noteCategory = (Text) findComponentById(ResourceTable.Id_add_note_category); 
  21.     Text noteTime = (Text) findComponentById(ResourceTable.Id_add_note_time); 
  22.  
  23.     HiLog.debug(LABEL, "%{public}s""saveNote, noteId:[" + noteId + "],noteCategory:" + noteCategory.getText()); 
  24.     int rowId; 
  25.     //放入鍵值 
  26.     valuesBucket.putString(Const.DB_COLUMN_TITLE, noteTitle.getText()); 
  27.     valuesBucket.putString(Const.DB_COLUMN_CATEGORY, noteCategory.getText()); 
  28.     valuesBucket.putString(Const.DB_COLUMN_CONTENT, noteContent.getText()); 
  29.     valuesBucket.putString(Const.DB_COLUMN_TIME, noteTime.getText()); 
  30.     try { 
  31.         if (noteId.isEmpty()) { 
  32.             HiLog.debug(LABEL, "%{public}s""saveNote, insert"); 
  33.             //插入數(shù)據(jù) 
  34.             rowId = dataAbilityHelper.insert(Uri.parse(Const.BASE_URI + Const.DATA_PATH), valuesBucket); 
  35.             HiLog.debug(LABEL, "%{public}s""insert,rowId:" + rowId); 
  36.  
  37.         } else { 
  38.             HiLog.debug(LABEL, "%{public}s""saveNote, update"); 
  39.             //指定修改謂語(yǔ) 
  40.             DataAbilityPredicates predicates = new DataAbilityPredicates(); 
  41.             predicates.equalTo(Const.DB_COLUMN_ID, noteId); 
  42.             //修改數(shù)據(jù) 
  43.             rowId = dataAbilityHelper.update(Uri.parse(Const.BASE_URI + Const.DATA_PATH), valuesBucket, predicates); 
  44.             HiLog.debug(LABEL, "%{public}s""update,rowId:" + rowId); 
  45.         } 
  46.  
  47.         //返回列表頁(yè) 
  48.         backListPage(); 
  49.     } catch (DataAbilityRemoteException | IllegalStateException exception) { 
  50.         HiLog.error(LABEL, "%{public}s""insert: dataRemote exception|illegalStateException"); 
  51.     } 

b.修改和刪除數(shù)據(jù)

  1. @Override 
  2. public void onStart(Intent intent) { 
  3.     super.onStart(intent); 
  4.     //設(shè)置UI布局資源 
  5.     super.setUIContent(ResourceTable.Layout_ability_add_note); 
  6.     // 
  7.     initDatabaseHelper(); 
  8.     //返回按鈕 
  9.     Component backButton = findComponentById(ResourceTable.Id_back_image); 
  10.     backButton.setClickedListener(component -> terminateAbility()); 
  11.     TextField noteContent = (TextField) findComponentById(ResourceTable.Id_add_note_content); 
  12.  
  13.  
  14.     //修改筆記 
  15.     if (intent.hasParameter("Id")) { 
  16.         HiLog.info(LABEL, "%{public}s""change data coming"); 
  17.         noteId = intent.getStringParam("Id"); 
  18.         HiLog.info(LABEL, "%{public}s""noteId:" + noteId); 
  19.         if (noteId != null) { 
  20.             DataAbilityPredicates predicates = new DataAbilityPredicates(); 
  21.             predicates.equalTo(Const.DB_COLUMN_ID, noteId); 
  22.             //查詢數(shù)據(jù) 
  23.             NoteListItemInfo itemInfo = queryOne(predicates); 
  24.             HiLog.info(LABEL, "%{public}s""noteTitle:" + itemInfo.getNoteTitle() + ",category:" + itemInfo.getNoteCategory()); 
  25.             //設(shè)置顯示 
  26.             TextField noteTitle = (TextField) findComponentById(ResourceTable.Id_add_note_title); 
  27.             noteTitle.setText(itemInfo.getNoteTitle()); 
  28.  
  29.             noteContent.setText(itemInfo.getNoteContent()); 
  30.  
  31.             Text category = (Text) findComponentById(ResourceTable.Id_add_note_category); 
  32.             category.setText(itemInfo.getNoteCategory()); 
  33.  
  34.             Text noteTime = (Text) findComponentById(ResourceTable.Id_add_note_time); 
  35.             noteTime.setText(itemInfo.getNoteTime()); 
  36.  
  37.  
  38.             Component deleteButton = findComponentById(ResourceTable.Id_delete_image); 
  39.             //設(shè)置刪除按鈕可用,只有修改筆記才能刪除 
  40.             deleteButton.setClickable(true); 
  41.             //添加事件 
  42.             deleteButton.setClickedListener(component -> { 
  43.                 try { 
  44.                     int rowId = dataAbilityHelper.delete(Uri.parse(Const.BASE_URI + Const.DATA_PATH), predicates); 
  45.                     HiLog.info(LABEL, "%{public}s""deleteNote,rowId:" + rowId); 
  46.  
  47.                     //返回列表頁(yè) 
  48.                     backListPage(); 
  49.                 } catch (DataAbilityRemoteException e) { 
  50.                     HiLog.error(LABEL, "%{public}s""delete: exception|DataAbilityRemoteException"); 
  51.                 } 
  52.             }); 
  53.         } 
  54.     } else { 
  55.         Text timeText = (Text) findComponentById(ResourceTable.Id_add_note_time); 
  56.         String time24 = sdf.format(new Date()); 
  57.         timeText.setText(time24); 
  58.     } 
  59.  
  60.     //保存筆記 
  61.     Component insertButton = findComponentById(ResourceTable.Id_finish_image); 
  62.     insertButton.setClickedListener(this::saveNote); 
  63.  

c.查詢數(shù)據(jù)

  1. private NoteListItemInfo queryOne(DataAbilityPredicates predicates) { 
  2.     HiLog.info(LABEL, "%{public}s""database query"); 
  3.     String[] columns = new String[]{ 
  4.             Const.DB_COLUMN_ID, 
  5.             Const.DB_COLUMN_TITLE, Const.DB_COLUMN_TIME, 
  6.             Const.DB_COLUMN_CATEGORY, Const.DB_COLUMN_CONTENT}; 
  7.     try { 
  8.         ResultSet resultSet = dataAbilityHelper.query( 
  9.                 Uri.parse(Const.BASE_URI + Const.DATA_PATH), columns, predicates); 
  10.  
  11.         //無(wú)數(shù)據(jù) 
  12.         if (resultSet.getRowCount() == 0) { 
  13.             HiLog.info(LABEL, "%{public}s""query:No result found"); 
  14.             return null
  15.         } 
  16.         // 
  17.         resultSet.goToFirstRow(); 
  18.         //根據(jù)列索引獲取列值 
  19.         String noteId = resultSet.getString(resultSet.getColumnIndexForName(Const.DB_COLUMN_ID)); 
  20.         String noteTitle = resultSet.getString(resultSet.getColumnIndexForName(Const.DB_COLUMN_TITLE)); 
  21.         String noteTime = resultSet.getString(resultSet.getColumnIndexForName(Const.DB_COLUMN_TIME)); 
  22.         String noteCategory = resultSet.getString(resultSet.getColumnIndexForName(Const.DB_COLUMN_CATEGORY)); 
  23.         String noteContent = resultSet.getString(resultSet.getColumnIndexForName(Const.DB_COLUMN_CONTENT)); 
  24.         Element image = ElementScatter.getInstance(getContext()).parse(ResourceTable.Graphic_icon_nodata); 
  25.         HiLog.info(LABEL, "%{public}s""set  show:" + noteCategory); 
  26.         // 
  27.         return new NoteListItemInfo(noteId, noteTitle, noteContent, noteTime, noteCategory, image); 
  28.  
  29.     } catch (DataAbilityRemoteException | IllegalStateException exception) { 
  30.         HiLog.error(LABEL, "%{public}s""query: dataRemote exception|illegalStateException"); 
  31.     } 
  32.     return null

實(shí)踐中遇到的小知識(shí)點(diǎn)記錄一下

1. 如何監(jiān)聽(tīng) TextField 文本變更事件

  1. /** 
  2.  * 監(jiān)聽(tīng)TextFiled 文本變化 
  3.  */ 
  4. private void initSearchBtnEvent(AbilitySlice slice) { 
  5.     TextField searchTF = (TextField) findComponentById(ResourceTable.Id_tf_note_search); 
  6.     //添加文本觀察器 TextObserver 以檢測(cè)文本是否發(fā)生更改。 
  7.     searchTF.addTextObserver(new Text.TextObserver() { 
  8.         @Override 
  9.         public void onTextUpdated(String s, int i, int i1, int i2) { 
  10.             HiLog.info(LABEL, "addTextObserver 按鍵事件觸發(fā)....."); 
  11.             //篩選數(shù)據(jù) 
  12.             initLists(slice); 
  13.         } 
  14.     }); 

2. ListContainer 組件添加點(diǎn)擊事件

在 Provider 中 getComponent添加,在初始化Provider時(shí)傳遞AbilitySlice對(duì)象過(guò)來(lái)

  1. public ListItemProvider(List<ItemInfo> itemList, AbilityContext context,AbilitySlice slice) { 
  2.     this.itemList = itemList; 
  3.     this.context = context; 
  4.     this.typeFactory = new ListTypeFactory(); 
  5.     this.slice=slice; 
  6. @Override 
  7. public Component getComponent(int index, Component component, ComponentContainer componentContainer) { 
  8.     Component itemComponent = component; 
  9.     ViewHolder viewHolder; 
  10.     if (itemComponent == null) { 
  11.         itemComponent = LayoutScatter.getInstance(componentContainer.getContext()) 
  12.                 .parse(getItemComponentType(index), componentContainer, false); 
  13.  
  14.     } 
  15.     viewHolder = typeFactory.getViewHolder(getItemComponentType(index), itemComponent); 
  16.     viewHolder.setUpComponent(getItem(index), context); 
  17.  
  18.  
  19.     //設(shè)置點(diǎn)擊事件 
  20.     itemComponent.setClickedListener(component1 -> { 
  21.         //獲取noteId 
  22.         String noteId=""
  23.         if(getItem(index) instanceof NoteListItemInfo){ 
  24.             //HiLog.debug(LABEL, "%{public}s""ItemInfo instanceof SingleButtonDoubleLineListItemInfo"); 
  25.             noteId=((NoteListItemInfo)getItem(index)).getNoteId(); 
  26.         } 
  27.         HiLog.debug(LABEL, "%{public}s""noteId:" + noteId); 
  28.         //1.攜帶筆記ID參數(shù),跳轉(zhuǎn)到AddNoteAbilitySlice 
  29.         Intent intent = new Intent(); 
  30.         if(noteId!=null){ 
  31.             //保存要傳遞的參數(shù) 
  32.             intent.setParam("Id", noteId); 
  33.             Operation operation = new Intent.OperationBuilder() 
  34.                     .withDeviceId(""
  35.                     .withBundleName("com.buty.samples"
  36.                     .withAbilityName(AddNoteAbility.class).build(); 
  37.             intent.setOperation(operation); 
  38.  
  39.             slice.startAbility(intent); 
  40.         }else { 
  41.             HiLog.error(LABEL, "%{public}s""noteId is null"); 
  42.         } 
  43.     }); 
  44.  
  45.     return itemComponent; 

效果展示

文章相關(guān)附件可以點(diǎn)擊下面的原文鏈接前往下載。

原文鏈接:https://harmonyos.51cto.com/posts/7386

想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來(lái)源: 鴻蒙社區(qū)
相關(guān)推薦

2022-04-08 11:25:58

數(shù)據(jù)庫(kù)操作AbilityData

2021-09-06 10:24:12

鴻蒙HarmonyOS應(yīng)用

2021-09-03 15:41:00

鴻蒙HarmonyOS應(yīng)用

2009-08-19 16:40:26

C#操作Access數(shù)

2011-07-12 15:22:04

SQLite數(shù)據(jù)庫(kù)

2021-08-17 10:20:14

鴻蒙HarmonyOS應(yīng)用

2021-09-15 14:55:49

鴻蒙HarmonyOS應(yīng)用

2010-08-18 13:49:01

DB2數(shù)據(jù)庫(kù)

2022-05-24 15:06:57

AbilityeTS FA鴻蒙

2011-08-02 16:43:26

iPhone開(kāi)發(fā) Ssqlite3 數(shù)據(jù)庫(kù)

2021-09-17 14:43:54

鴻蒙HarmonyOS應(yīng)用

2021-09-24 09:25:01

鴻蒙HarmonyOS應(yīng)用

2021-11-23 09:58:35

鴻蒙HarmonyOS應(yīng)用

2021-07-28 14:40:57

鴻蒙HarmonyOS應(yīng)用

2022-08-01 13:59:04

數(shù)據(jù)庫(kù)通信ArkUI

2010-09-30 08:27:48

2010-09-30 09:11:01

2010-09-27 14:54:38

SQL數(shù)據(jù)庫(kù)

2010-08-31 16:53:54

DHCP數(shù)據(jù)庫(kù)

2021-07-08 09:42:04

鴻蒙HarmonyOS應(yīng)用
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

久草视频在线观| 在线观看岛国av| 日本啊v在线| 久久亚洲不卡| 久久精品夜夜夜夜夜久久| 亚洲国产综合av| 性爽视频在线| 国产精品成人一区二区艾草| 99se婷婷在线视频观看| 东京热一区二区三区四区| 欧美韩国日本在线观看| 亚洲精品一区在线观看| 热久久精品国产| 国产在线看片| 久久久高清一区二区三区| 国产精品自产拍在线观| 国产一级淫片a| 欧美a级片视频| 亚洲精品按摩视频| 在线观看av免费观看| 小早川怜子影音先锋在线观看| 国产精品国产三级国产| 久久国产尿小便嘘嘘| 日韩欧美成人精品| 欧美一级中文字幕| 亚州视频一区二区三区| 国内精品久久久久影院色 | 国产激情在线观看| 91蜜桃在线免费视频| 99在线免费观看视频| 中国黄色一级视频| 亚洲在线黄色| 久久久久久久久91| 日本一级二级视频| 日韩一区电影| 在线观看欧美视频| 丰满少妇一区二区| 成人av影音| 欧美一区日本一区韩国一区| 国产精品视频分类| 向日葵视频成人app网址| 亚洲成人资源网| 亚洲激情免费视频| 成人video亚洲精品| 国产精品久久久久久久久搜平片| 加勒比在线一区二区三区观看 | 亚洲国产又黄又爽女人高潮的| 日本特黄在线观看| 国产精品欧美一区二区三区不卡| 欧美无砖砖区免费| 国产三级日本三级在线播放| 乡村艳史在线观看| 天天影视涩香欲综合网| 免费毛片网站在线观看| 欧美aaaaaaa| 亚洲高清免费在线| av在线观看地址| 国产天堂在线播放视频| 亚洲3atv精品一区二区三区| av免费看网址| 久久久精品99| 日夜干在线视频| 久久成人麻豆午夜电影| 国产精品综合网站| 一级片在线观看视频| 免费成人美女在线观看| 国产精品网站视频| 国产精品玖玖玖| 国产麻豆欧美日韩一区| 亚洲xxxx做受欧美| 亚洲黄色在线免费观看| 成人国产免费视频| 精品欧美国产一区二区三区不卡| 日韩电影免费| 国产欧美一区二区精品忘忧草| 午夜精品区一区二区三| 麻豆视频网站在线观看| 依依成人综合视频| 免费看又黄又无码的网站| 综合毛片免费视频| 欧美日韩在线观看一区二区 | 日韩精品免费一线在线观看| 免费观看av网站| 欧美日韩国产在线观看网站| 日韩中文字幕在线看| 人妻少妇精品一区二区三区| 精品99视频| 日韩av电影在线播放| 一级片免费观看视频| 国产成人av影院| 蜜桃麻豆www久久国产精品| 大胆av不用播放器在线播放| 亚洲人一二三区| 日韩成人午夜影院| 成人福利视频| 欧美一区二区三区免费观看视频| 捆绑凌虐一区二区三区| 久久精品国产亚洲夜色av网站| 免费av一区二区| 亚洲天堂一区在线| 狠狠色丁香九九婷婷综合五月| 福利视频久久| 日韩专区在线| 天天影视色香欲综合网老头| 91av视频免费观看| 久久精品色综合| 日韩一区二区av| 草久久免费视频| 国产乱子伦视频一区二区三区| 久久精品久久精品国产大片| 黄色免费在线看| 色噜噜狠狠色综合中国| 在线播放国产视频| 日韩一区电影| 日韩av片免费在线观看| 性色av蜜臀av| 日本中文字幕在线一区| 福利一区福利二区| 久久久一本精品99久久精品66| 日日夜夜精品一区| 色综合欧美在线| 99精品一区二区三区无码吞精| 日韩欧美一区二区三区在线视频| 91av在线精品| 亚洲大尺度视频| 中文字幕一区日韩精品欧美| 成人免费观看毛片| 成人免费在线电影网| 久久精品国产2020观看福利| 久久精品五月天| 91在线观看免费视频| 今天免费高清在线观看国语| 亚洲热av色在线播放| 亚洲人成电影网站色xx| 日本熟妇一区二区| 国产精品一区二区久激情瑜伽| 午夜精品一区二区三区在线观看 | 亚洲精品欧美在线| 国产福利在线免费| 国产乱码精品一区二区三区四区| 97在线观看视频国产| 亚洲欧美高清视频| 亚洲欧美另类在线| 成 人 黄 色 小说网站 s色| 欧美熟乱15p| 欧美在线观看视频在线| 国产日韩精品入口| 狠狠色伊人亚洲综合网站l| 欧美性猛交xxxxx免费看| 国产伦精品一区二区三区妓女| 99精品视频免费| 精品国产免费久久久久久尖叫| а√在线天堂官网| 精品视频—区二区三区免费| 国产超碰人人爽人人做人人爱| 成人午夜av电影| 三上悠亚久久精品| 亚洲精品推荐| 国产精品成人v| 在线观看美女网站大全免费| 欧美色涩在线第一页| 操她视频在线观看| 国产精品一区二区三区99| 青青视频免费在线观看| 国产精品久久久网站| 97精品国产97久久久久久免费 | 日韩精品视频观看| 性无码专区无码| 国产午夜精品久久久久久久| 日日噜噜夜夜狠狠| 亚洲国产日韩欧美在线| 97netav| hd国产人妖ts另类视频| 日韩电影免费观看在线观看| 亚洲av中文无码乱人伦在线视色| 91理论电影在线观看| 欧美激情xxxxx| 狂野欧美性猛交| 国产经典欧美精品| 国产午夜大地久久| 久久av影视| 国产中文字幕亚洲| av蜜臀在线| 亚洲另类欧美自拍| 一级黄色大片免费观看| 夜夜精品视频一区二区| 国产精品边吃奶边做爽| 蜜乳av一区二区三区| 韩国黄色一级大片| 欧美理伦片在线播放| 国产黑人绿帽在线第一区| 欧美激情二区| 亚洲成人网久久久| 成年人视频免费| 一区二区三区在线观看网站| 黑人巨大精品欧美| 经典一区二区三区| av动漫在线观看| 国产精品88久久久久久| 国产精品久久久久av福利动漫| 欧美人与性动交α欧美精品济南到| 亚洲精品视频在线播放 | 天堂蜜桃一区二区三区 | 永久免费成人代码| 夫妻av一区二区| 亚洲人辣妹窥探嘘嘘| 欧美天天在线| 一区二区三区在线观看www| 卡通动漫国产精品| 成人激情在线观看| 日韩高清在线| 91av在线免费观看| 日本三级在线观看网站| 综合网中文字幕| 香蕉视频国产在线| 日韩精品一区二区三区四区| 国产又粗又猛又爽又| 五月婷婷激情综合网| 欧美做爰爽爽爽爽爽爽| 中文字幕av资源一区| 亚洲精品在线视频免费观看| 国产乱色国产精品免费视频| 污视频网站观看| 久久九九免费| 18禁免费观看网站| 可以直接在线观看的av| 成人激情动漫在线观看| 亚洲天堂网站在线| 免费看欧美女人艹b| 看av免费毛片手机播放| 亚洲性色视频| 日韩精品免费一区| 天天做天天爱天天综合网2021| 日本亚洲自拍| 欧美极品中文字幕| 久久另类ts人妖一区二区| 激情亚洲另类图片区小说区| 99伊人久久| 亚洲国产高清在线观看| 91夜夜未满十八勿入爽爽影院| 福利一区二区| 国产精品久久电影观看| 日韩中文影院| 国产成人短视频| 麻豆视频在线观看免费网站黄| 欧美丰满少妇xxxxx做受| 在线āv视频| 欧美精品一二区| v天堂福利视频在线观看| 久久精品91久久久久久再现| 999在线视频| 日韩中文字幕久久| 久草免费在线观看| 久久亚洲精品网站| 91cn在线观看| 久久久久久久久久久av| 好久没做在线观看| 91av视频在线观看| 激情开心成人网| 国产精品扒开腿爽爽爽视频 | 国产一区二区三区福利| 一区二区在线视频播放| 春暖花开成人亚洲区| 中文字幕亚洲图片| 麻豆网站视频在线观看| 欧美二区乱c黑人| eeuss鲁一区二区三区| 91精品国产91久久久久久| 亚洲欧洲自拍| 国产精品永久免费观看| 麻豆精品一区| 国产一级精品aaaaa看| 伊人久久大香线蕉av不卡| 亚洲欧洲日本国产| 亚洲精品二区三区| 成人免费播放器| 日韩国产精品久久久| 99九九99九九九99九他书对| 国产黄色91视频| 无码人妻精品一区二区三区温州| 免费在线播放电影| 色天使色偷偷av一区二区 | 日韩视频在线一区二区| 日本精品一二区| 亚洲欧美另类在线观看| 欧美成人三区| 91精品国产777在线观看| 欧美与亚洲与日本直播| 3d精品h动漫啪啪一区二区| 国产精品久久久久久久久久白浆 | 天天综合色天天| 中国女人一级一次看片| 精品久久久影院| 丁香婷婷在线观看| 欧美日韩第一视频| 影视一区二区三区| 97人人干人人| 欧美日韩第一| 欧洲精品一区二区三区久久| 麻豆专区一区二区三区四区五区| 97中文字幕在线观看| 国产欧美一区视频| 久久久久久久伊人| 欧美日韩一级片在线观看| 欧美一级性视频| 日韩亚洲一区二区| 欧美亚洲大片| 国产精品一区二区三区精品| 色天天久久综合婷婷女18| 久色视频在线播放| 韩国视频一区二区| 免费污网站在线观看| 亚洲主播在线播放| 亚洲综合网av| 日韩精品中文字幕久久臀| 香蕉成人app免费看片| 国产精品久久久久久久久久小说 | 无遮挡亚洲一区| 99亚洲一区二区| 99热这里只有精品2| 欧美国产精品中文字幕| www.国产com| 亚洲精品国偷自产在线99热| 中文字幕伦理免费在线视频 | 中国a一片一级一片| 日韩精品视频免费| 超碰97国产精品人人cao| 91久久精品日日躁夜夜躁国产| 国产欧美亚洲精品a| 无码人妻丰满熟妇区96| 成人黄色综合网站| 欧美黄片一区二区三区| 在线不卡免费欧美| 尤物视频在线免费观看| 一区二区三区在线观看网站| 色诱视频在线观看| 成人午夜激情在线| 欧美黄色免费看| 91精品黄色片免费大全| 午夜伦理在线| 国产精品欧美亚洲777777| 精品国产一区探花在线观看| 久久无码高潮喷水| 久久午夜羞羞影院免费观看| 69视频免费在线观看| 日韩精品久久久久久久玫瑰园| 波多野结衣乳巨码无在线观看| 91免费看蜜桃| 国产精品www994| 中文字幕一区二区三区人妻在线视频 | 日产日韩在线亚洲欧美| 色婷婷av一区二区三区丝袜美腿| 成人性免费视频| 91美女精品福利| 在线观看日韩中文字幕| 亚洲欧美精品一区二区| 亚洲成人人体| 日韩在线观看电影完整版高清免费| 日韩av网站在线观看| 亚洲色图日韩精品| 欧美日韩国产成人在线免费| 菠萝菠萝蜜在线视频免费观看| 91亚洲人电影| 激情综合自拍| 亚洲午夜福利在线观看| 色婷婷综合久久久中文一区二区| 国产三级视频在线看| 国产免费一区视频观看免费 | 国产欧美啪啪| 日韩在线视频在线观看| 国产喷白浆一区二区三区| 91 中文字幕| 久久久久久91香蕉国产| 香蕉久久99| www.亚洲高清| 亚洲自拍偷拍图区| 久久手机免费观看| 91精品国产综合久久男男| 欧美另类视频| 丰满少妇一区二区| 欧美日韩一区二区欧美激情| 暖暖在线中文免费日本| 久久综合狠狠综合久久综青草| 人人超碰91尤物精品国产| 国产高潮流白浆| 亚洲精品第一国产综合精品| 精品3atv在线视频| 波多野结衣激情| 91视频精品在这里| 国产情侣一区二区| 91国产精品91| 99成人超碰| 欧美无人区码suv| 欧美丰满一区二区免费视频| www.8ⅹ8ⅹ羞羞漫画在线看| 日韩中文字幕一区| 成人免费av资源| 亚洲专区第一页| 97在线日本国产| 91不卡在线观看|