简体   繁体   English

在Pebble上读写持久数据

[英]Reading and writing persistent data on Pebble

I am making a very simple archery field score tracking app for Pebble and I am having issues with storing and retrieving integer values between sessions. 我正在为Pebble制作一个非常简单的射箭场成绩跟踪应用程序,并且在会话之间存储和检索整数值时遇到问题。 The act of storing and retrieving is working fine, but for some odd reason only 1 value is retrieved and then populated in to the second variable so they are both the same. 存储和检索的工作正常,但是由于某种奇怪的原因,只检索了1个值,然后将其填充到第二个变量中,因此它们都相同。

Pasting my full code, including my debug logging while trying to figure it out. 粘贴我的完整代码,包括调试日志,同时尝试找出原因。 All values are correct even when unloading the window, but when retrieving the values on the next window load, it seems to just get 1... ? 即使在卸载窗口时,所有值也是正确的,但是在下次加载窗口时检索值时,似乎只得到1 ...?

/*  TODO
    - Show time bar along top of screen
*/

#include <pebble.h>

uint32_t keyTotal,keyTargets;
static Window *window;
static TextLayer *text_layer_SCORE,*text_layer_TARGETS,*text_layer_TOTAL,*text_layer_TITLE;
int score,targets,total;
char targetText[]="Targets: ";
char scoreText[]="Score: ";
char totalText[]="TOTAL: ";
char currentScore[]="Score: xxxx";
char currentTotal[]="TOTAL: xxxx";
char currentTargets[]="Targets: xxx";

static void logValues(char *string) {
  APP_LOG(APP_LOG_LEVEL_INFO, string);
  APP_LOG(APP_LOG_LEVEL_DEBUG, "----- SCORE: %i", score);
  APP_LOG(APP_LOG_LEVEL_DEBUG, "----- TOTAL: %i", total);
  APP_LOG(APP_LOG_LEVEL_DEBUG, "----- TARGETS: %i", targets);
}

static void updateScore() {
  snprintf(currentScore,sizeof(currentScore),"%s %d",scoreText,score);
  text_layer_set_text(text_layer_SCORE, currentScore);

  logValues("----- AFTER UPDATE SCORE");
}

static void updateTotal() {
  snprintf(currentTotal,sizeof(currentTotal),"%s %d",totalText,total);
  text_layer_set_text(text_layer_TOTAL, currentTotal);

  logValues("----- UPDATE TOTAL");
}

static void updateTargets() {
  snprintf(currentTargets,sizeof(currentTargets),"%s %d",targetText,targets);
  text_layer_set_text(text_layer_TARGETS, currentTargets);

  logValues("----- AFTER UPDATE TARGETS");
}

static void updateAll() {
  updateTotal();
  updateTargets();
  updateScore();

  logValues("----- AFTER UPDATE ALL");
}

static void persistValues() {
  persist_write_int(keyTotal, total);
  persist_write_int(keyTargets, targets);

  logValues("----- AFTER PERSIST VALUES");
}

static void resetValues() {
  score = 0;
  total = 0;
  targets = 0;
  persist_write_int(keyTargets, 0);
  persist_write_int(keyTotal, 0);

  logValues("----- AFTER RESET VALUES");
}

static void select_click_handler(ClickRecognizerRef recognizer, void *context) {
  total = total + score;
  ++targets;
  updateAll();

  logValues("----- AFTER SELECT PRESSED");
}

static void up_click_handler(ClickRecognizerRef recognizer, void *context) {
  // text_layer_set_text(text_layer, "Up");
  score++;
  updateScore();

  logValues("----- AFTER UP PRESSED");
}

static void down_click_handler(ClickRecognizerRef recognizer, void *context) {
  // text_layer_set_text(text_layer, "Down");
  score--;
  updateScore();

  logValues("----- AFTER DOWN PRESSED");
}

static void up_long_click_handler(ClickRecognizerRef recognizer, void *context) {
  //Window *window = (Window *)context;
}

static void up_long_click_release_handler(ClickRecognizerRef recognizer, void *context) {
  //Window *window = (Window *)
  resetValues();
  updateAll();
}

static void click_config_provider(void *context) {
  window_single_click_subscribe(BUTTON_ID_SELECT, select_click_handler);
  window_single_click_subscribe(BUTTON_ID_UP, up_click_handler);
  window_single_click_subscribe(BUTTON_ID_DOWN, down_click_handler);
  window_long_click_subscribe(BUTTON_ID_UP, 3000, up_long_click_handler, up_long_click_release_handler);
}

static void window_load(Window *window) {
  Layer *window_layer = window_get_root_layer(window);
  GRect bounds = layer_get_bounds(window_layer);

  logValues("----- START OF WINDOW LOAD");

  score = 0;

  // Get previous total (if it exists)
  if(persist_exists(keyTotal)) {
    total = persist_read_int(keyTotal);
  } else {
    total = 0;
    //persist_write_int(keyTotal, total);
    APP_LOG(APP_LOG_LEVEL_DEBUG, "----- PERSIST TOTAL NOT FOUND, SETTING: %i", total);
  }

  // Get previous targets (if it exists)
  if(persist_exists(keyTargets)) {
    targets = persist_read_int(keyTargets);
  } else {
    targets = 0;
    //persist_write_int(keyTargets, targets);
    APP_LOG(APP_LOG_LEVEL_DEBUG, "----- PERSIST TARGETS NOT FOUND, SETTING: %i", targets);
  }

  APP_LOG(APP_LOG_LEVEL_DEBUG, "----- PERSIST END, TOTAL IS CURRENTLY: %i", total);
  APP_LOG(APP_LOG_LEVEL_DEBUG, "----- PERSIST END, TOTAL IS CURRENTLY: %i", total);

  window_set_click_config_provider(window, (ClickConfigProvider) click_config_provider);

  text_layer_TITLE = text_layer_create(GRect(0, 0, bounds.size.w, bounds.size.h));
  text_layer_SCORE = text_layer_create(GRect(0, 40, bounds.size.w, 35));
  text_layer_TARGETS = text_layer_create(GRect(0, 80, bounds.size.w, 35));
  text_layer_TOTAL = text_layer_create(GRect(0,120, bounds.size.w, 50));

  text_layer_set_text(text_layer_TITLE, "ScoreTracker");

  text_layer_set_text(text_layer_SCORE, currentScore);
  text_layer_set_text(text_layer_TARGETS, currentTargets);
  text_layer_set_text(text_layer_TOTAL, currentTotal);

  updateAll();

  text_layer_set_text_color(text_layer_TOTAL, GColorWhite);
  text_layer_set_text_color(text_layer_TARGETS, GColorWhite);
  text_layer_set_text_color(text_layer_SCORE, GColorBlack);
  text_layer_set_background_color(text_layer_TITLE, GColorGreen);
  text_layer_set_background_color(text_layer_TOTAL, GColorBlack);
  text_layer_set_background_color(text_layer_SCORE, GColorLightGray);
  text_layer_set_background_color(text_layer_TARGETS, GColorBlue);
  text_layer_set_text_alignment(text_layer_TITLE, GTextAlignmentCenter);
  text_layer_set_text_alignment(text_layer_SCORE, GTextAlignmentLeft);
  text_layer_set_text_alignment(text_layer_TARGETS, GTextAlignmentLeft);
  text_layer_set_text_alignment(text_layer_TOTAL, GTextAlignmentCenter);

  // Fonts
  text_layer_set_font(text_layer_TITLE, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD));
  text_layer_set_font(text_layer_SCORE, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD));
  text_layer_set_font(text_layer_TARGETS, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD));
  text_layer_set_font(text_layer_TOTAL, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD));

  layer_add_child(window_layer, text_layer_get_layer(text_layer_TITLE));
  layer_add_child(window_layer, text_layer_get_layer(text_layer_SCORE));
  layer_add_child(window_layer, text_layer_get_layer(text_layer_TARGETS));
  layer_add_child(window_layer, text_layer_get_layer(text_layer_TOTAL));

  logValues("----- END OF WINDOW LOAD");
}

static void window_unload(Window *window) {
  text_layer_destroy(text_layer_SCORE);
  text_layer_destroy(text_layer_TARGETS);
  text_layer_destroy(text_layer_TOTAL);
  text_layer_destroy(text_layer_TITLE);
  persistValues();

  logValues("----- END OF WINDOW UNLOAD");
}

static void init(void) {
  window = window_create();
  window_set_click_config_provider(window, click_config_provider);

  window_set_window_handlers(window, (WindowHandlers) {
    .load = window_load,
    .unload = window_unload,
  });
  const bool animated = true;
  window_stack_push(window, animated);

  logValues("----- END OF INIT");
}

static void deinit(void) {
  window_destroy(window);
}

int main(void) {
  init();

  APP_LOG(APP_LOG_LEVEL_DEBUG, "Done initializing, pushed window: %p", window);

  app_event_loop();
  deinit();
}

Here is the log output from running the above app code, making some score changes, exiting and reloading the app. 这是运行上述应用程序代码,进行一些分数更改,退出并重新加载应用程序后输出的日志。

[INFO] ocess_manager.c:419: Heap Usage for App <ScoreTrack: Total Size <62480B> Used <628B> Still allocated <0B>
[INFO] button_click.c:19: ----- START OF WINDOW LOAD
[DEBUG] button_click.c:20: ----- SCORE: 0
[DEBUG] button_click.c:21: ----- TOTAL: 0
[DEBUG] button_click.c:22: ----- TARGETS: 0
[DEBUG] button_click.c:126: ----- PERSIST TOTAL NOT FOUND, SETTING: 0
[DEBUG] button_click.c:135: ----- PERSIST TARGETS NOT FOUND, SETTING: 0
[DEBUG] button_click.c:138: ----- PERSIST END, TOTAL IS CURRENTLY: 0
[DEBUG] button_click.c:139: ----- PERSIST END, TARGETS IS CURRENTLY: 0
[INFO] button_click.c:19: ----- UPDATE TOTAL
[DEBUG] button_click.c:20: ----- SCORE: 0
[DEBUG] button_click.c:21: ----- TOTAL: 0
[DEBUG] button_click.c:22: ----- TARGETS: 0
[INFO] button_click.c:19: ----- AFTER UPDATE TARGETS
[DEBUG] button_click.c:20: ----- SCORE: 0
[DEBUG] button_click.c:21: ----- TOTAL: 0
[DEBUG] button_click.c:22: ----- TARGETS: 0
[INFO] button_click.c:19: ----- AFTER UPDATE SCORE
[DEBUG] button_click.c:20: ----- SCORE: 0
[DEBUG] button_click.c:21: ----- TOTAL: 0
[DEBUG] button_click.c:22: ----- TARGETS: 0
[INFO] button_click.c:19: ----- AFTER UPDATE ALL
[DEBUG] button_click.c:20: ----- SCORE: 0
[DEBUG] button_click.c:21: ----- TOTAL: 0
[DEBUG] button_click.c:22: ----- TARGETS: 0
[INFO] button_click.c:19: ----- END OF WINDOW LOAD
[DEBUG] button_click.c:20: ----- SCORE: 0
[DEBUG] button_click.c:21: ----- TOTAL: 0
[DEBUG] button_click.c:22: ----- TARGETS: 0
[INFO] button_click.c:19: ----- END OF INIT
[DEBUG] button_click.c:20: ----- SCORE: 0
[DEBUG] button_click.c:21: ----- TOTAL: 0
[DEBUG] button_click.c:22: ----- TARGETS: 0
[DEBUG] button_click.c:213: Done initializing, pushed window: 0x20020c0c
[INFO] button_click.c:19: ----- AFTER UPDATE SCORE
[DEBUG] button_click.c:20: ----- SCORE: 1
[DEBUG] button_click.c:21: ----- TOTAL: 0
[DEBUG] button_click.c:22: ----- TARGETS: 0
[INFO] button_click.c:19: ----- AFTER UP PRESSED
[DEBUG] button_click.c:20: ----- SCORE: 1
[DEBUG] button_click.c:21: ----- TOTAL: 0
[DEBUG] button_click.c:22: ----- TARGETS: 0
[INFO] button_click.c:19: ----- AFTER UPDATE SCORE
[DEBUG] button_click.c:20: ----- SCORE: 2
[DEBUG] button_click.c:21: ----- TOTAL: 0
[DEBUG] button_click.c:22: ----- TARGETS: 0
[INFO] button_click.c:19: ----- AFTER UP PRESSED
[DEBUG] button_click.c:20: ----- SCORE: 2
[DEBUG] button_click.c:21: ----- TOTAL: 0
[DEBUG] button_click.c:22: ----- TARGETS: 0
[INFO] button_click.c:19: ----- AFTER UPDATE SCORE
[DEBUG] button_click.c:20: ----- SCORE: 3
[DEBUG] button_click.c:21: ----- TOTAL: 0
[DEBUG] button_click.c:22: ----- TARGETS: 0
[INFO] button_click.c:19: ----- AFTER UP PRESSED
[DEBUG] button_click.c:20: ----- SCORE: 3
[DEBUG] button_click.c:21: ----- TOTAL: 0
[DEBUG] button_click.c:22: ----- TARGETS: 0
[INFO] button_click.c:19: ----- AFTER UPDATE SCORE
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 0
[DEBUG] button_click.c:22: ----- TARGETS: 0
[INFO] button_click.c:19: ----- AFTER UP PRESSED
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 0
[DEBUG] button_click.c:22: ----- TARGETS: 0
[INFO] button_click.c:19: ----- UPDATE TOTAL
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 4
[DEBUG] button_click.c:22: ----- TARGETS: 1
[INFO] button_click.c:19: ----- AFTER UPDATE TARGETS
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 4
[DEBUG] button_click.c:22: ----- TARGETS: 1
[INFO] button_click.c:19: ----- AFTER UPDATE SCORE
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 4
[DEBUG] button_click.c:22: ----- TARGETS: 1
[INFO] button_click.c:19: ----- AFTER UPDATE ALL
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 4
[DEBUG] button_click.c:22: ----- TARGETS: 1
[INFO] button_click.c:19: ----- AFTER SELECT PRESSED
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 4
[DEBUG] button_click.c:22: ----- TARGETS: 1
[INFO] button_click.c:19: ----- UPDATE TOTAL
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 8
[DEBUG] button_click.c:22: ----- TARGETS: 2
[INFO] button_click.c:19: ----- AFTER UPDATE TARGETS
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 8
[DEBUG] button_click.c:22: ----- TARGETS: 2
[INFO] button_click.c:19: ----- AFTER UPDATE SCORE
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 8
[DEBUG] button_click.c:22: ----- TARGETS: 2
[INFO] button_click.c:19: ----- AFTER UPDATE ALL
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 8
[DEBUG] button_click.c:22: ----- TARGETS: 2
[INFO] button_click.c:19: ----- AFTER SELECT PRESSED
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 8
[DEBUG] button_click.c:22: ----- TARGETS: 2
[INFO] button_click.c:19: ----- UPDATE TOTAL
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 12
[DEBUG] button_click.c:22: ----- TARGETS: 3
[INFO] button_click.c:19: ----- AFTER UPDATE TARGETS
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 12
[DEBUG] button_click.c:22: ----- TARGETS: 3
[INFO] button_click.c:19: ----- AFTER UPDATE SCORE
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 12
[DEBUG] button_click.c:22: ----- TARGETS: 3
[INFO] button_click.c:19: ----- AFTER UPDATE ALL
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 12
[DEBUG] button_click.c:22: ----- TARGETS: 3
[INFO] button_click.c:19: ----- AFTER SELECT PRESSED
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 12
[DEBUG] button_click.c:22: ----- TARGETS: 3
[INFO] button_click.c:19: ----- UPDATE TOTAL
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 16
[DEBUG] button_click.c:22: ----- TARGETS: 4
[INFO] button_click.c:19: ----- AFTER UPDATE TARGETS
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 16
[DEBUG] button_click.c:22: ----- TARGETS: 4
[INFO] button_click.c:19: ----- AFTER UPDATE SCORE
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 16
[DEBUG] button_click.c:22: ----- TARGETS: 4
[INFO] button_click.c:19: ----- AFTER UPDATE ALL
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 16
[DEBUG] button_click.c:22: ----- TARGETS: 4
[INFO] button_click.c:19: ----- AFTER SELECT PRESSED
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 16
[DEBUG] button_click.c:22: ----- TARGETS: 4
[INFO] button_click.c:19: ----- UPDATE TOTAL
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 20
[DEBUG] button_click.c:22: ----- TARGETS: 5
[INFO] button_click.c:19: ----- AFTER UPDATE TARGETS
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 20
[DEBUG] button_click.c:22: ----- TARGETS: 5
[INFO] button_click.c:19: ----- AFTER UPDATE SCORE
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 20
[DEBUG] button_click.c:22: ----- TARGETS: 5
[INFO] button_click.c:19: ----- AFTER UPDATE ALL
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 20
[DEBUG] button_click.c:22: ----- TARGETS: 5
[INFO] button_click.c:19: ----- AFTER SELECT PRESSED
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 20
[DEBUG] button_click.c:22: ----- TARGETS: 5
[INFO] button_click.c:19: ----- UPDATE TOTAL
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 24
[DEBUG] button_click.c:22: ----- TARGETS: 6
[INFO] button_click.c:19: ----- AFTER UPDATE TARGETS
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 24
[DEBUG] button_click.c:22: ----- TARGETS: 6
[INFO] button_click.c:19: ----- AFTER UPDATE SCORE
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 24
[DEBUG] button_click.c:22: ----- TARGETS: 6
[INFO] button_click.c:19: ----- AFTER UPDATE ALL
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 24
[DEBUG] button_click.c:22: ----- TARGETS: 6
[INFO] button_click.c:19: ----- AFTER SELECT PRESSED
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 24
[DEBUG] button_click.c:22: ----- TARGETS: 6
[INFO] button_click.c:19: ----- AFTER PERSIST VALUES
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 24
[DEBUG] button_click.c:22: ----- TARGETS: 6
[INFO] button_click.c:19: ----- END OF WINDOW UNLOAD
[DEBUG] button_click.c:20: ----- SCORE: 4
[DEBUG] button_click.c:21: ----- TOTAL: 24
[DEBUG] button_click.c:22: ----- TARGETS: 6
[INFO] ocess_manager.c:419: Heap Usage for App <ScoreTrack: Total Size <62480B> Used <628B> Still allocated <0B>
[INFO] button_click.c:19: ----- START OF WINDOW LOAD
[DEBUG] button_click.c:20: ----- SCORE: 0
[DEBUG] button_click.c:21: ----- TOTAL: 0
[DEBUG] button_click.c:22: ----- TARGETS: 0
[DEBUG] button_click.c:138: ----- PERSIST END, TOTAL IS CURRENTLY: 6
[DEBUG] button_click.c:139: ----- PERSIST END, TARGETS IS CURRENTLY: 6
[INFO] button_click.c:19: ----- UPDATE TOTAL
[DEBUG] button_click.c:20: ----- SCORE: 0
[DEBUG] button_click.c:21: ----- TOTAL: 6
[DEBUG] button_click.c:22: ----- TARGETS: 6
[INFO] button_click.c:19: ----- AFTER UPDATE TARGETS
[DEBUG] button_click.c:20: ----- SCORE: 0
[DEBUG] button_click.c:21: ----- TOTAL: 6
[DEBUG] button_click.c:22: ----- TARGETS: 6
[INFO] button_click.c:19: ----- AFTER UPDATE SCORE
[DEBUG] button_click.c:20: ----- SCORE: 0
[DEBUG] button_click.c:21: ----- TOTAL: 6
[DEBUG] button_click.c:22: ----- TARGETS: 6
[INFO] button_click.c:19: ----- AFTER UPDATE ALL
[DEBUG] button_click.c:20: ----- SCORE: 0
[DEBUG] button_click.c:21: ----- TOTAL: 6
[DEBUG] button_click.c:22: ----- TARGETS: 6
[INFO] button_click.c:19: ----- END OF WINDOW LOAD
[DEBUG] button_click.c:20: ----- SCORE: 0
[DEBUG] button_click.c:21: ----- TOTAL: 6
[DEBUG] button_click.c:22: ----- TARGETS: 6
[INFO] button_click.c:19: ----- END OF INIT
[DEBUG] button_click.c:20: ----- SCORE: 0
[DEBUG] button_click.c:21: ----- TOTAL: 6
[DEBUG] button_click.c:22: ----- TARGETS: 6
[DEBUG] button_click.c:213: Done initializing, pushed window: 0x20020c0c

I tried to use data structures instead for saving and retrieving these values but cannot for the life of me figure out how this is done. 我试图使用数据结构来代替保存和检索这些值,但是我一生都无法弄清楚该如何完成。 The example on the Pebble dev site isn't padded out enough for me to fill in the blanks. Pebble开发人员站点上的示例不足以填补我的空白。 Still only a hobby coder for things like this so there are probably a whole bunch of basics that I'm just completely missing here. 仍然只是这类事情的业余编码者,因此我可能在这里完全缺少一堆基础知识。 Any help is greatly appreciated! 任何帮助是极大的赞赏!

Figured it out. 弄清楚了。 I misinterpreted the key value as just the integer that you want to save to the storage, and not an actual key value for the place where the value lives in storage. 我将键值错误地解释为只是要保存到存储中的整数,而不是该值位于存储中的实际键值。 So every time I saved and retrieved the values it was saving and retrieving from different locations depending on what the value was at the time. 因此,每次保存和检索值时,都会根据当时的值在不同的位置进行保存和检索。

Looking at the Persist Counter code example at the following page helped me https://developer.pebble.com/examples/ 在下面的页面中查看Persist Counter代码示例可以帮助我https://developer.pebble.com/examples/

Relevant code is now 现在是相关代码

#define NUM_TOTAL_DEFAULT 0
#define NUM_TARGETS_DEFAULT 0
#define NUM_TOTAL_PKEY 1
#define NUM_TARGETS_PKEY 2

...

static void persistValues() {
  persist_write_int(NUM_TARGETS_PKEY, targets);
  persist_write_int(NUM_TOTAL_PKEY, total);
}

... 

static void init(void) {
  // SET PERSISTENT VALUES IF EXISTS
  total = persist_exists(NUM_TOTAL_PKEY) ? persist_read_int(NUM_TOTAL_PKEY) : NUM_TOTAL_DEFAULT;
  targets = persist_exists(NUM_TARGETS_PKEY) ? persist_read_int(NUM_TARGETS_PKEY) : NUM_TARGETS_DEFAULT;

...

}

static void deinit(void) {
  // SAVE VALUES IN TO PERSISTENT STORAGE
  persistValues();

  window_destroy(window);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM