Чтение / запись / добавление файла в ionic 3, используя @ ionic-native / file - PullRequest
0 голосов
/ 29 июня 2018

У меня было требование чтения и обновления файла json в соответствии с пользовательским взаимодействием с приложением. Но не нашел много информации о записи файла json, используя @ ionic-native / file . После небольших исследований и разработок я смог выполнить свое требование. Поэтому здесь я публикую сообщение о том, как читать / писать / добавлять файл json с помощью @ ionic-native / file, для других разработчиков иона, у которых также может быть такое же требование.

Parser.ts

export class Parser {
    static instance: Parser
    jsonData: {} = {}
    nativeURL: string
    fileName = 'data.json'
    private constructor(private file: File) {
    }

    doFileInteractions() {
        let that = this
        let writeDataCompletionHandler = function (success, data) {
            if (success) {
                console.log('Final jsonData')
                console.log(that.jsonData)
            }
            else {

            }
        }
        let readDataCompletionHandler = function (success, data) {
            if (success) {
                that.jsonData = JSON.parse(data)
                console.log('JSON data...')
                console.log(that.jsonData)
                that.writeJsonData(writeDataCompletionHandler)
            }
            else {

            }
        }
        this.readJsonData(readDataCompletionHandler)
    }

    readJsonData(completionHandler) {
        let dirName = 'www/assets/data'
        console.log('this.file.applicationDirectory>>')
        console.log(this.file.applicationDirectory)

        this.file.listDir(this.file.applicationDirectory, dirName)
            .then((list) => {
                console.log('Success: listDir')
                console.log(list)
                list.forEach(element => {
                    if (element.name == this.fileName) {
                        // READ FILE
                        this.nativeURL = element.nativeURL.replace('/' + this.fileName, '')
                        this.file.readAsText(this.nativeURL, this.fileName)
                            .then((result) => {
                                console.log('Success: readAsText')
                                console.log(result)
                                completionHandler(true, result)
                            })
                            .catch((error) => {
                                console.log('Failure: readAsText')
                                console.log(error)
                                completionHandler(false, error)
                            })
                        console.log('nativeURL: ')
                        console.log(this.nativeURL)
                    }
                });
            })
            .catch((error) => {
                console.log('Failure: listDir')
                console.log(error)
            })

    }

    writeJsonData(completionHandler) {
        // WRITE FILE
        this.jsonData['data']['newData'] = 'X1234'
        let stringyfiedJson = JSON.stringify(this.jsonData)
        this.file.writeFile(this.nativeURL, this.fileName, stringyfiedJson, { append: false, replace: true })
            .then((result) => {
                console.log('Success: Writefile')
                console.log(result)
                completionHandler(true, result)
            })
            .catch((error) => {
                console.log('Failure: WriteFile')
                console.log(error)
                completionHandler(false, error)
            })
    }

    static setInstance(file: File) {
    if (!this.instance) {
        this.instance = new Util_Parser(file)
    }
}

Для записи : {append: false, replace: true}

Для добавления : {append: true, replace: false}

app.component.ts

export class MyApp {
          @ViewChild(Nav) nav: Nav;

          rootPage: any = HomePage;

          pages: Array<{ title: string, component: any, enable: boolean }>;

          constructor(
            public platform: Platform,
            public statusBar: StatusBar,
            public splashScreen: SplashScreen,
            public events: Events,
            public file: File) {
            this.initializeApp();

            this.pages = [
              { title: 'Home', component: HomePage, enable: true },
              { title: 'Input', component: UserInputPage, enable: true }
            ];

            // initialize parser
            Parser.setInstance(this.file)
        }
      }

HomePage.ts

export class HomePage {

  constructor(public navCtrl: NavController,
    public navParams: NavParams,
    public popoverCtrl: PopoverController,
    public formbuilder: FormBuilder, public file: File) {

    Parser.instance.doFileInteractions()
  }
}

ионная информация

cli пакеты: (/ usr / local / lib / node_modules)

@ionic/cli-utils  : 1.19.2
ionic (Ionic CLI) : 3.20.0

глобальные пакеты:

cordova (Cordova CLI) : 8.0.0

местные пакеты:

@ionic/app-scripts : 3.1.9
Cordova Platforms  : ios 4.5.4
Ionic Framework    : ionic-angular 3.9.2

Система:

ios-deploy : 1.9.2
Node       : v8.11.1
npm        : 6.1.0
OS         : macOS High Sierra
Xcode      : Xcode 9.1 Build version 9B55
...