【问题标题】:Ionic Storage Module to set and get Object instead of string离子存储模块设置和获取对象而不是字符串
【发布时间】:2018-11-25 08:24:42
【问题描述】:

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

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

我需要像数据库一样持久化这些键和值。

使用带有 NgModel 的输入和 2 个按钮(一个用于设置数据,一个用于获取数据)我试图在我的 Ionic 3 应用程序(没有 Sql Lite)中保存一些用户名,但我看到 storage.set 只接受字符串值。我的想法是使用JSON.parse 来检索保存在数组中的数据,但值在开始时是字符串,所以如果您有任何想法,请告诉我。 Bellow 是我尝试过的代码,但出现错误:“core.js:1449 ERROR Error: Uncaught (in promise): SyntaxError: Unexpected token d in JSON at position 0 SyntaxError:JSON 中位置 0 的意外标记 d 在 JSON.parse()"

PS:如果你还不够清楚,请随时问我在附近一段时间。 这是我的代码:

参数.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);
     });
    }
  }

参数.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>

【问题讨论】:

  • Hey Emile,所以您当前的代码说键和值都是字符串(键:字符串,输入文本:字符串)。分配没有任何 JSON.parse 的值应该没有问题。
  • 所以你是说在你的应用中你可以有 username1、username2、username3 等等,你想使用 ionic Storage 来持久化他们的名字?
  • @SergeyRudenko 是的,没错,用户将使用输入保存他们的用户名
  • 我更新了答案,但我认为我仍然不清楚您的用例。我们在这里讨论的是在特定用户的机器上运行的客户端代码。持久性也是“本地的”(离子存储)。所以我希望你不要指望这是一个网络服务,用户实际上可以从他们的本地客户端一起修改数据?
  • 不不,它只是本地的(仅在 Ipad 上),并且应用程序的这一部分有任何 wheb 服务

标签: typescript ionic-framework ionic3 ionic-storage


【解决方案1】:

在您的情况下,您存储在 Storage 中的值是一个字符串 (inputext:string)。如果您尝试按原样解析字符串,JSON.parse 将引发错误。在此处查看更多信息:Why does JSON.parse("string") fail

现在根据您的代码,您根本不需要 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
         });
    }
}

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

  1. 根据“密钥”区分存储的数据。因此,键(在用于将数据保存到存储中的键/值对中)应该代表唯一用户,当然需要跟踪此类用户才能检索这些用户:
users = ["userUniqueName1", "userUniqueName2", etc]
...
this.storage.get(users[1]).then(()=>{...})
  1. 将数据存储在对象中并在存储前对其进行字符串化:
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);
    })
}

【讨论】:

  • 我觉得我的问题不够清楚,我更新了我的帖子
  • 您的代码有效,但我需要保存多个用户以便稍后在 storage.get 中检索它们
  • 非常感谢,我正在尝试,然后我会告诉你
  • 我建议您从用户的角度详细描述您想要的结果,作为您问题的一部分。有点挖掘你正在解决的问题,而不是想太多的解决方案。这绝对有帮助。
猜你喜欢
  • 2018-11-29
  • 2018-08-20
  • 1970-01-01
  • 1970-01-01
  • 2017-12-23
  • 2019-01-24
  • 1970-01-01
  • 2023-04-04
  • 2015-05-30
相关资源
最近更新 更多