• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16import fileio from '@ohos.fileio'
17import { LogUtil } from './LogUtil'
18import FolderUtil from './FolderUtil'
19import NoteUtil from './NoteUtil'
20import SysDefData from '../model/databaseModel/SysDefData'
21import FolderData from '../model/databaseModel/FolderData'
22import NoteData from '../model/databaseModel/NoteData'
23import {
24  TableSql,
25  TableName,
26  FolderTableColumn,
27  NoteTableColumn,
28  SysDefFolderUuid
29} from '../model/databaseModel/EnumData'
30import relationalStore from '@ohos.data.relationalStore'
31import util from '@ohos.util';
32
33const TAG = "RdbStoreUtil"
34
35const FileMaxSize: number = 20 * 1024 * 1024
36
37/**
38 * db instance
39 */
40
41export default {
42  /**
43   * create db and table
44   */
45  createRdbStore(context) {
46    relationalStore.getRdbStore(context, SysDefData.dbInfo.db_name)
47      .then(async (store) => {
48        // add sys-def folder and note to AppStorage
49        let folderDataArray = []
50        let sysDefFolderArray = [SysDefData.sys_def_allNotes, SysDefData.sys_def_unClassified,
51        SysDefData.sys_def_myFavorites, SysDefData.sys_def_recentDeletes,
52        SysDefData.sys_def_personal, SysDefData.sys_def_life, SysDefData.sys_def_work]
53        sysDefFolderArray.forEach((sysDefFolder) => {
54          let folderData = new FolderData(sysDefFolder.id, sysDefFolder.name, sysDefFolder.uuid, sysDefFolder.color,
55          sysDefFolder.folder_type, sysDefFolder.is_deleted, sysDefFolder.created_time,
56          sysDefFolder.modified_time)
57          folderDataArray.push(folderData)
58        })
59        LogUtil.info(TAG, "folderDataArray[sysdef] : " + folderDataArray.length)
60
61        let noteDataArray = []
62        let sysDefNoteArray = [SysDefData.sys_def_note1, SysDefData.sys_def_note2,
63        SysDefData.sys_def_note3, SysDefData.sys_def_note4]
64        sysDefNoteArray.forEach((sysDefNote) => {
65          let noteData = new NoteData(sysDefNote.id, sysDefNote.title, sysDefNote.uuid, sysDefNote.folder_uuid, sysDefNote.content_text,
66          sysDefNote.content_img, sysDefNote.note_type, sysDefNote.is_top, sysDefNote.is_favorite,
67          sysDefNote.is_deleted, sysDefNote.created_time, sysDefNote.modified_time, sysDefNote.deleted_time, sysDefNote.slider_value)
68          noteDataArray.push(noteData)
69        })
70        LogUtil.info(TAG, "noteDataArray[sysdef] : " + noteDataArray.length)
71
72        AppStorage.SetOrCreate('AllFolderArray', folderDataArray)
73        AppStorage.SetOrCreate('AllNoteArray', noteDataArray)
74        LogUtil.info(TAG, "AppStorage[sysdef] set AllFolderArray and AllNoteArray success")
75
76        // save continue data
77        let isContinue = AppStorage.Get<boolean>('IsContinue');
78        LogUtil.info(TAG, "createRdbStore, isContinue is " + isContinue)
79        if (isContinue) {
80          let continueNote: string = AppStorage.Get('ContinueNote')
81          let continueSection = AppStorage.Get('ContinueSection')
82          let noteObj = JSON.parse(continueNote)
83          let noteData = new NoteData(noteObj.uuid, noteObj.title, noteObj.uuid, noteObj.folder_uuid,
84          noteObj.content_text, noteObj.content_img, noteObj.note_type, noteObj.is_top, noteObj.is_favorite,
85          noteObj.is_deleted, noteObj.created_time, noteObj.modified_time, noteObj.deleted_time, noteObj.slider_value)
86
87          // save img to FileDir
88          LogUtil.info(TAG, "createRdbStore, save img to FileDir")
89          let imgNameArray = this.getImgNameFromHtml(noteData)
90          imgNameArray.forEach((imgName: string) => {
91            this.writeToFileDir(imgName)
92          })
93
94          // if not exit this note
95          let exist = false
96          let folderUuid = ""
97          for (let note of noteDataArray) {
98            if (noteData.created_time == note.created_time) {
99              exist = true
100              folderUuid = note.folder_uuid
101              break
102            }
103          }
104          LogUtil.info(TAG, "createRdbStore, exist : " + exist)
105          if (!exist) {
106            // 迁移过来的笔记在本地不存在,则保存在未分类文件夹
107            noteData.folder_uuid = SysDefFolderUuid.UnClassified
108            noteDataArray.push(noteData)
109            AppStorage.SetOrCreate('AllNoteArray', noteDataArray)
110            this.insert(TableName.NoteTable, noteData.toNoteObject(), null)
111            AppStorage.SetOrCreate('Folder', FolderUtil.getFolderData(folderDataArray, SysDefFolderUuid.UnClassified))
112          } else {
113            // 迁移过来的笔记在本地存在,则进行修改
114            for (let i = 0; i < noteDataArray.length; i++) {
115              if (noteData.created_time == noteDataArray[i].created_time) {
116                noteDataArray[i] = noteData
117                LogUtil.info(TAG, "createRdbStore, update noteData in noteDataArray success")
118                break
119              }
120            }
121            let predicates_note = this.getRdbPredicates(TableName.NoteTable)
122            predicates_note.equalTo(NoteTableColumn.CreatedTime, noteData.created_time)
123            this.update(noteData.toNoteObject(), predicates_note, null)
124            AppStorage.SetOrCreate('Folder', FolderUtil.getFolderData(folderDataArray, folderUuid))
125          }
126          AppStorage.SetOrCreate('Note', noteData)
127          AppStorage.SetOrCreate<string>('ContinueNote', JSON.stringify(noteData.toNoteObject()))
128          AppStorage.SetOrCreate('Section', continueSection)
129          AppStorage.SetOrCreate<NoteData>('NewNote', noteData)
130        } else {
131          LogUtil.info(TAG, "createRdbStore, IsContinue false")
132          AppStorage.SetOrCreate('Folder', AppStorage.Get('AllFolderArray')[0])
133          let note = NoteUtil.getFirstNoteData(AppStorage.Get('AllNoteArray'), SysDefFolderUuid.AllNotes)
134          AppStorage.SetOrCreate('Note', note)
135          if (note) {
136            AppStorage.SetOrCreate<string>('ContinueNote', JSON.stringify(note.toNoteObject()))
137          }
138          AppStorage.SetOrCreate('Section', 3)
139        }
140        AppStorage.SetOrCreate('DBQueryFinished', 1)
141        LogUtil.info(TAG, "createRdbStore, set DBQueryFinished 1")
142        LogUtil.info(TAG, "createRdbStore, store is " + store)
143        globalThis.rdbStore = store
144        // create table
145        await globalThis.rdbStore.executeSql(TableSql.FolderTableSQL, null)
146        await globalThis.rdbStore.executeSql(TableSql.NoteTableSQL, null)
147        await globalThis.rdbStore.executeSql(TableSql.AttachmentTableSQL, null)
148        await globalThis.rdbStore.executeSql(TableSql.FormTableSQL, null)
149        LogUtil.info(TAG, "create table success")
150        // insert system defined folder
151        await globalThis.rdbStore.insert(TableName.FolderTable, SysDefData.sys_def_allNotes)
152        await globalThis.rdbStore.insert(TableName.FolderTable, SysDefData.sys_def_unClassified)
153        await globalThis.rdbStore.insert(TableName.FolderTable, SysDefData.sys_def_myFavorites)
154        await globalThis.rdbStore.insert(TableName.FolderTable, SysDefData.sys_def_recentDeletes)
155        await globalThis.rdbStore.insert(TableName.FolderTable, SysDefData.sys_def_personal)
156        await globalThis.rdbStore.insert(TableName.FolderTable, SysDefData.sys_def_life)
157        await globalThis.rdbStore.insert(TableName.FolderTable, SysDefData.sys_def_work)
158        LogUtil.info(TAG, "insert system defined folder success")
159        // insert system defined note and attachment
160        await globalThis.rdbStore.insert(TableName.NoteTable, SysDefData.sys_def_note1)
161        await globalThis.rdbStore.insert(TableName.NoteTable, SysDefData.sys_def_note2)
162        await globalThis.rdbStore.insert(TableName.NoteTable, SysDefData.sys_def_note3)
163        await globalThis.rdbStore.insert(TableName.NoteTable, SysDefData.sys_def_note4)
164        LogUtil.info(TAG, "insert system defined note and attachment success")
165      })
166      .catch((err) => {
167        LogUtil.warn(TAG, "createRdbStore, error : " + err)
168      })
169  },
170
171  /**
172   * query folders and notes from the database, then save them to the AppStorage.
173   */
174  initAppStorage(context) {
175    let folderDataArray = []
176    let noteDataArray = []
177    relationalStore.getRdbStore(context, SysDefData.dbInfo.db_name)
178      .then(async (store) => {
179        LogUtil.info(TAG, "initAppStorage, store is " + store)
180        globalThis.rdbStore = store
181        // query folder
182        let columns_folder = []
183        let predicates_folder = new relationalStore.RdbPredicates(TableName.FolderTable)
184        let resultSet_folder = await globalThis.rdbStore.query(predicates_folder, columns_folder)
185        while (resultSet_folder.goToNextRow()) {
186          let id = resultSet_folder.getLong(resultSet_folder.getColumnIndex(FolderTableColumn.Id))
187          let name = resultSet_folder.getString(resultSet_folder.getColumnIndex(FolderTableColumn.Name))
188          let uuid = resultSet_folder.getString(resultSet_folder.getColumnIndex(FolderTableColumn.Uuid))
189          let color = resultSet_folder.getString(resultSet_folder.getColumnIndex(FolderTableColumn.Color))
190          let folder_type = resultSet_folder.getLong(resultSet_folder.getColumnIndex(FolderTableColumn.FolderType))
191          let is_deleted = resultSet_folder.getLong(resultSet_folder.getColumnIndex(FolderTableColumn.IsDeleted))
192          let created_time = resultSet_folder.getLong(resultSet_folder.getColumnIndex(FolderTableColumn.CreatedTime))
193          let modified_time = resultSet_folder.getLong(resultSet_folder.getColumnIndex(FolderTableColumn.ModifiedTime))
194          let folderData = new FolderData(id, name, uuid, color, folder_type, is_deleted, created_time, modified_time)
195          folderDataArray.push(folderData)
196        }
197        resultSet_folder.close();
198        LogUtil.info(TAG, "folderDataArray[query] : " + folderDataArray.length)
199        // query note
200        let columns_note = []
201        let predicates_note = new relationalStore.RdbPredicates(TableName.NoteTable)
202        let resultSet_note = await globalThis.rdbStore.query(predicates_note, columns_note)
203        while (resultSet_note.goToNextRow()) {
204          let id = resultSet_note.getLong(resultSet_note.getColumnIndex(NoteTableColumn.Id))
205          let title = resultSet_note.getString(resultSet_note.getColumnIndex(NoteTableColumn.Title))
206          let uuid = resultSet_note.getString(resultSet_note.getColumnIndex(NoteTableColumn.Uuid))
207          let folder_uuid = resultSet_note.getString(resultSet_note.getColumnIndex(NoteTableColumn.FolderUuid))
208          // 暂时规避备忘录二次打开白屏问题,后续数据库解决
209          let content_text = '';
210          let content_img = '';
211          try {
212            content_text = resultSet_note.getString(resultSet_note.getColumnIndex(NoteTableColumn.ContentText))
213            content_img = resultSet_note.getString(resultSet_note.getColumnIndex(NoteTableColumn.ContentImg))
214          } catch (err) {
215            LogUtil.error(TAG, "initAppStorage, content_img = error : " + err)
216          }
217          let noteType = resultSet_note.getLong(resultSet_note.getColumnIndex(NoteTableColumn.NoteType))
218          let is_top = resultSet_note.getLong(resultSet_note.getColumnIndex(NoteTableColumn.IsTop))
219          let is_favorite = resultSet_note.getLong(resultSet_note.getColumnIndex(NoteTableColumn.IsFavorite))
220          let is_deleted = resultSet_note.getLong(resultSet_note.getColumnIndex(NoteTableColumn.IsDeleted))
221          let created_time = resultSet_note.getLong(resultSet_note.getColumnIndex(NoteTableColumn.CreatedTime))
222          let modified_time = resultSet_note.getLong(resultSet_note.getColumnIndex(NoteTableColumn.ModifiedTime))
223          let deleted_time = resultSet_note.getLong(resultSet_note.getColumnIndex(NoteTableColumn.DeletedTime))
224          let slider_value = resultSet_note.getLong(resultSet_note.getColumnIndex(NoteTableColumn.SliderValue))
225          let noteData = new NoteData(id, title, uuid, folder_uuid, content_text, content_img, noteType, is_top, is_favorite, is_deleted, created_time, modified_time, deleted_time, slider_value)
226          noteDataArray.push(noteData)
227        }
228        resultSet_note.close();
229        LogUtil.info(TAG, "noteDataArray[query] : " + noteDataArray.length)
230        if (folderDataArray === null || folderDataArray === undefined || folderDataArray.length === 0) {
231          LogUtil.info(TAG, "folderDataArray is null")
232          let sysDefFolderArray = [SysDefData.sys_def_allNotes, SysDefData.sys_def_unClassified,
233          SysDefData.sys_def_myFavorites, SysDefData.sys_def_recentDeletes,
234          SysDefData.sys_def_personal, SysDefData.sys_def_life, SysDefData.sys_def_work]
235          sysDefFolderArray.forEach((sysDefFolder) => {
236            let folderData = new FolderData(sysDefFolder.id, sysDefFolder.name, sysDefFolder.uuid, sysDefFolder.color,
237            sysDefFolder.folder_type, sysDefFolder.is_deleted, sysDefFolder.created_time,
238            sysDefFolder.modified_time)
239            folderDataArray.push(folderData)
240          })
241          LogUtil.info(TAG, "folderDataArray[query] : " + folderDataArray.length)
242        }
243        AppStorage.SetOrCreate('AllFolderArray', folderDataArray)
244        AppStorage.SetOrCreate('AllNoteArray', noteDataArray)
245        LogUtil.info(TAG, "AppStorage[query] set AllFolderArray and AllNoteArray success")
246
247        // save continue data
248        let isContinue = AppStorage.Get<boolean>('IsContinue');
249        LogUtil.info(TAG, "initAppStorage, isContinue is " + isContinue)
250        if (isContinue) {
251          let continueNote: string = AppStorage.Get('ContinueNote')
252          let continueSection = AppStorage.Get('ContinueSection')
253
254          let noteObj = JSON.parse(continueNote)
255          let noteData = new NoteData(noteObj.uuid, noteObj.title, noteObj.uuid, noteObj.folder_uuid,
256          noteObj.content_text, noteObj.content_img, noteObj.note_type, noteObj.is_top, noteObj.is_favorite,
257          noteObj.is_deleted, noteObj.created_time, noteObj.modified_time, noteObj.deleted_time, noteObj.slider_value)
258
259          // save img to FileDir
260          LogUtil.info(TAG, "initAppStorage, save img to FileDir")
261          let imgNameArray = this.getImgNameFromHtml(noteData)
262          imgNameArray.forEach((imgName: string) => {
263            this.writeToFileDir(imgName)
264          })
265
266          // if not exit this note
267          let exist = false
268          let folderUuid = ""
269          for (let note of noteDataArray) {
270            if (noteData.created_time == note.created_time) {
271              exist = true
272              folderUuid = note.folder_uuid
273              break
274            }
275          }
276          LogUtil.info(TAG, "initAppStorage, exist : " + exist)
277          if (!exist) {
278            // 迁移过来的笔记在本地不存在,则保存在未分类文件夹
279            noteData.folder_uuid = SysDefFolderUuid.UnClassified
280            noteDataArray.push(noteData)
281            AppStorage.SetOrCreate('AllNoteArray', noteDataArray)
282            this.insert(TableName.NoteTable, noteData.toNoteObject(), null)
283            AppStorage.SetOrCreate('Folder', FolderUtil.getFolderData(folderDataArray, SysDefFolderUuid.UnClassified))
284          } else {
285            // 迁移过来的笔记在本地存在,则进行修改
286            for (let i = 0; i < noteDataArray.length; i++) {
287              if (noteData.created_time == noteDataArray[i].created_time) {
288                noteDataArray[i] = noteData
289                LogUtil.info(TAG, "initAppStorage, update noteData in noteDataArray success")
290                break
291              }
292            }
293            let predicates_note = this.getRdbPredicates(TableName.NoteTable)
294            predicates_note.equalTo(NoteTableColumn.CreatedTime, noteData.created_time)
295            this.update(noteData.toNoteObject(), predicates_note, null)
296            AppStorage.SetOrCreate('Folder', FolderUtil.getFolderData(folderDataArray, folderUuid))
297          }
298          AppStorage.SetOrCreate('Note', noteData)
299          AppStorage.SetOrCreate<string>('ContinueNote', JSON.stringify(noteData.toNoteObject()))
300          AppStorage.SetOrCreate('Section', continueSection)
301          AppStorage.SetOrCreate<NoteData>('NewNote', noteData)
302        } else {
303          LogUtil.info(TAG, "initAppStorage, IsContinue false")
304          AppStorage.SetOrCreate('Folder', AppStorage.Get('AllFolderArray')[0])
305          let note = NoteUtil.getFirstNoteData(AppStorage.Get('AllNoteArray'), SysDefFolderUuid.AllNotes)
306          AppStorage.SetOrCreate('Note', note)
307          if (note) {
308            AppStorage.SetOrCreate<string>('ContinueNote', JSON.stringify(note.toNoteObject()))
309          }
310          AppStorage.SetOrCreate('Section', 3)
311        }
312        AppStorage.SetOrCreate('DBQueryFinished', 1)
313        LogUtil.info(TAG, "initAppStorage, set DBQueryFinished 1")
314      })
315      .catch((err) => {
316        LogUtil.error(TAG, "initAppStorage, error : " + err)
317      })
318  },
319
320  getImgNameFromHtml(noteData: NoteData): any {
321    let newModuleName = "file://" + globalThis.noteContext.filesDir
322    let imgNameArray = []
323    if (noteData.content_text == undefined || noteData.content_text == null || noteData.content_text == "") {
324      LogUtil.info(TAG, "noteData.content_text is null or undefined")
325      return imgNameArray
326    }
327    let base64regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/
328    let html
329    if (base64regex.test(noteData.content_text)) {
330      let base64 = new util.Base64Helper
331      html = base64.decodeSync(noteData.content_text)
332    } else {
333      html = noteData.content_text
334    }
335    if (html == undefined || html == null || html == "") {
336      return imgNameArray
337    }
338    let imgReg = /<img[^>]+>/g
339    let srcReg = /src=[\'\"]?([^\'\"]*)[\'\"]?/i
340    let imgArray = html.match(imgReg)
341    if (imgArray != null) {
342      let hasFirstImg: boolean = false
343      for (let i = 0; i < imgArray.length; i++) {
344        let src = imgArray[i].match(srcReg)
345        if (src != null && src.length > 1) {
346          LogUtil.info(TAG, "getImgNameFromHtml, src[1] : " + src[1])
347          let lastIndex = src[1].lastIndexOf('/')
348          if (lastIndex != -1) {
349            let oldModuleName = src[1].substring(0, lastIndex)
350            let imgName = src[1].substring(lastIndex + 1)
351            noteData.content_text = noteData.content_text.replace(oldModuleName, newModuleName)
352            if (!hasFirstImg) {
353              noteData.content_img = newModuleName + "/" + imgName
354              hasFirstImg = true
355            }
356            imgNameArray.push(imgName)
357          }
358        }
359      }
360    }
361    return imgNameArray
362  },
363
364  writeToFileDir(fileName: string) {
365    LogUtil.info(TAG, "writeToFileDir fileName : " + fileName)
366
367    let desPath = globalThis.noteContext.filesDir + "/" + fileName
368    LogUtil.info(TAG, "desPath : " + desPath)
369    try {
370      fileio.accessSync(desPath)
371      LogUtil.info(TAG, "desPath has existed, return")
372      return
373    } catch (err) {
374      LogUtil.warn(TAG, "desPath has not existed, need to write")
375    }
376    let srcPath
377    let size
378    try {
379      srcPath = globalThis.noteContext.distributedFilesDir + "/" + fileName
380      LogUtil.info(TAG, "srcPath : " + srcPath)
381      size = fileio.statSync(srcPath).size
382      LogUtil.info(TAG, "srcPath size : " + size)
383      if (size > FileMaxSize) {
384        LogUtil.warn(TAG, "srcPath size more then FileMaxSize, return")
385        return
386      }
387    }
388    catch (err) {
389      LogUtil.warn(TAG, "desPath has not existed, need to write two")
390      return
391    }
392
393
394    let srcFd
395    try {
396      srcFd = fileio.openSync(srcPath, 0o0)
397      LogUtil.info(TAG, "open srcPath success : " + srcFd)
398    } catch (err) {
399      LogUtil.warn(TAG, "open srcPath failed : " + err)
400      return
401    }
402
403    let desFd
404    try {
405      desFd = fileio.openSync(desPath, 0o2 | 0o100, 0o400 | 0o200 | 0o040 | 0o020)
406      LogUtil.info(TAG, "open desPath success : " + srcFd)
407    } catch (err) {
408      LogUtil.warn(TAG, "open desPath failed : " + err)
409      return
410    }
411
412    let buf = new ArrayBuffer(size)
413    try {
414      let readNum = fileio.readSync(srcFd, buf)
415      LogUtil.info(TAG, "readNum : " + readNum)
416      let writeNum = fileio.writeSync(desFd, buf)
417      LogUtil.info(TAG, "writeNum : " + writeNum)
418    } catch (err) {
419      LogUtil.warn(TAG, "read or write error : " + err)
420    }
421  },
422
423  /**
424   * insert
425   * @param tableName
426   * @param valueBucket
427   * @param callback
428   */
429  insert(tableName, valueBucket, callback) {
430    globalThis.rdbStore.insert(tableName, valueBucket).then((rowId) => {
431      LogUtil.info(TAG, "insert success, rowId is " + rowId)
432      if (callback != null) {
433        callback(rowId)
434      }
435    }).catch((err) => {
436      LogUtil.warn(TAG, "insert error : " + err)
437    })
438  },
439
440  /**
441   * delete
442   * @param predicates
443   * @param callback
444   */
445  delete(predicates, callback) {
446    globalThis.rdbStore.delete(predicates).then((affectedRowCount) => {
447      LogUtil.info(TAG, "delete success, affectedRowCount is " + affectedRowCount)
448      if (callback != null) {
449        callback(affectedRowCount)
450      }
451    }).catch((err) => {
452      LogUtil.warn(TAG, "delete error : " + err)
453    })
454  },
455
456  /**
457   * update
458   * @param valueBucket
459   * @param predicates
460   * @param callback
461   */
462  update(valueBucket, predicates, callback) {
463    if (!globalThis.rdbStore) {
464      return;
465    }
466    globalThis.rdbStore.update(valueBucket, predicates).then((affectedRowCount) => {
467      LogUtil.info(TAG, "update success, affectedRowCount is " + affectedRowCount)
468      if (callback != null) {
469        callback(affectedRowCount)
470      }
471    }).catch((err) => {
472      LogUtil.warn(TAG, "update error : " + err)
473    })
474  },
475
476  /**
477   * query
478   * @param columns
479   * @param predicates
480   * @param callback
481   */
482  query(columns, predicates, callback) {
483    globalThis.rdbStore.query(predicates, columns).then((resultSet) => {
484      LogUtil.info(TAG, "query success, row count : " + resultSet.rowCount)
485      if (callback != null) {
486        callback(resultSet)
487      }
488    }).catch((err) => {
489      LogUtil.warn(TAG, "query error : " + err)
490    })
491  },
492
493  /**
494   * get RdbPredicates by table name
495   * @param tableName
496   */
497  getRdbPredicates(tableName) {
498    return new relationalStore.RdbPredicates(tableName)
499  },
500
501  updataNoteImage(noteData: NoteData): string {
502    let content_img = ""
503    let imgNameArray = this.getImgNameFromHtml(noteData)
504    if (imgNameArray.length == 0) {
505      return content_img
506    }
507    if (imgNameArray[0] == 'shuxue.png' || imgNameArray[0] == 'cake.png') {
508      content_img = "/res/" + imgNameArray[0]
509    } else {
510      content_img = noteData.content_img
511    }
512    LogUtil.info(TAG, "updataNoteImage, content_img : " + content_img)
513    return content_img
514  }
515}