首页 文章

Ionic Storage Module 设置和获取 Object 而不是 string

提问于
浏览
0

我需要在没有经典数据库的 Ionic 3 应用程序中保存一些用户名(输入)和图片(代码中未显示的另一个按钮,但逻辑将与我想的相同)(我想我将使用 base 64 作为基于图片的从设备上的相机)。然后我应该检索它们以创建 ion-card 配置文件。

实际上每次我运行我的 loadUser()函数它只检索我最后一个用户名但我想保存更多。即使我进入 chrome DevTools/IndexedDB,我也只能看到一个keyvalue

我需要坚持使用这些键和值,就像是数据库一样.

使用带有 NgModel 的输入和 2 个按钮(一个用于设置数据,一个用于获取数据)我试图在我的 Ionic 3 应用程序中保存一些用户名(没有 Sql Lite),但我看到 storage.set 只接受字符串值。我的想法是使用JSON.parse来检索数组中的数据保存,但是值是开始时的字符串,所以如果您有任何想法让我知道。 Bellow 是我尝试过的代码,但是我收到一个错误:“core.js:1449 错误错误:未捕获(在承诺中):SyntaxError:位于 0 的 JSON 中的意外标记 d 语法错误:位于 0 位于 JSON.parse()的 JSON 中的意外标记 d”

PS:如果不够清楚,你可以随意问我已经有一段时间了。这是我的代码:

parameter.ts

export class ParametrePage {

   key: string = 'username';

   inputext: string;

   inputextGroup = [];

  constructor(
    public navCtrl: NavController,
    public navParams: NavParams,
    private storage: Storage
 ) {}

  saveUser() {
  // set a key/value
     this.storage.set(this.key, this.inputext);
  }

  loadUser() {
// Or to get a key/value pair

  this.storage.get(this.key).then(val => {
  this.inputtextGroup = JSON.parse(val);
     console.log('You name is', val);
     });
    }
  }

parameter.html:

<h6>Add a profilname</h6>
    <div class="form-container">
      <div class="input-container">
        <p class="diName">Name :</p>
        <ion-input [(ngModel)]="inputext" class="daInput" type="text"></ion- input>
        </div>

  <button class="charlotte-button addUser" ion-button icon-left 
  (click)="saveUser()">
      <ion-icon class="picto picto-reply"></ion-icon>
      Add a user
    </button>

    <button class="charlotte-button addUser" ion-button icon-left 
 (click)="loadUser()">
      <ion-icon class="picto picto-reply"></ion-icon>
      Load user
    </button>

1 回答

  • 1

    在您的情况下,存储在存储中的值是一个字符串(inputext:string)。如果您尝试按原样解析字符串,JSON.parse 将抛出错误。在这里查看更多:为什么 JSON.parse(“string”)失败

    现在根据您的代码,您根本不需要 JSON.parse:

    loadUser() {
    // Or to get a key/value pair
      this.storage.get(this.key).then(val => {
      this.inputtextGroup = val;
         console.log('You name is', val);
         });
      }
    }
    

    但如果你说你的数据输入最终可能是别的东西。然后你可以尝试使用 try catch 来调整它:

    loadUser() {
    // Or to get a key/value pair
      this.storage.get(this.key).then(val => {
             try {
                 JSON.parse(val);
             } catch(e) {
                 // do here what you need since its a string
             }
                 // do here what you need with parsed data
             });
        }
    }
    

    现在,如果需要在应用程序中一次存储多个名称。您可以使用以下几种“策略”:

    • 根据“密钥”区分存储的数据。因此,密钥(用于将数据保存到存储中的 key/value 对)应该代表唯一用户,当然需要跟踪这些用户以便能够检索这些用户:
    
    

    用户= [9]
    ...
    this.storage.get(users [10] ).then(() => {。 11})

     
     
    - Store data in an object and stringify it before storing:
     
     
    
    > ```java
    users = [ 
        { name: "userUniqueName1", surname: "whatever" },
        { name: "userUniqueName2", surname: "whatever" },
        ... 
    ]
    

    现在在存储对象(数组)之前,需要对其进行字符串化:

    storeUsers() {
        let usersStringifiedObj = JSON.stringify(this.users);
        this.storage.set("users", usersStringifiedObj);
    }
    
    retrieveUsers() {
        this.storage.get("users").then( users => {
            this.users = JSON.parse(users);
        })
    }
    

相关问题