【插件开发】—— 8 IPreferenceStore,插件的键/值存储!

前文回顾:

插件学习篇

简单的建立插件工程以及模型文件分析

利用扩展点,开发透视图

SWT编程须知

SWT简单控件的使用与布局搭配

SWT复杂空间与布局搭配

7 SWT布局详解

  前几篇讲解了SWT的基本知识。这篇作为穿插,讲述一下工作终于到的一个问题,并且借着这个机会,好好的学习了一下!

  先描述下我遇到的问题吧:

  由于对插件的了解也并不全面,很多知识点都不知道。学习其他人的开源源码时,我遇到了下面的报错:

1  org.eclipse.jface.resource.DataFormatException
2  at org.eclipse.jface.resource.StringConverter.asRGB(StringConverter.java:567)
3  at com.xxxxxx.rcp.dbeditor.util.EditorColorProvider.getToken(EditorColorProvider.java:32)

  根据报错提示的位置,以及调试发现,是有colorName为空,从而无法进行转换

 1 public IToken getToken(String prefKey) {
 2   System.out.println(store.getString(prefKey));
 3   Token token = (Token) tokenTable.get(prefKey);
 4   if (token == null) {
 5    String colorName = store.getString(prefKey);
 6    RGB rgb = StringConverter.asRGB(colorName);
 7    token = new Token(new TextAttribute(getColor(rgb)));
 8    tokenTable.put(prefKey, token);
 9   }
10   return token;
11  }

  追踪堆栈,发现这个store根本没有任何getString的方法以及map类型的存储集合。

  很费解这个对象时怎么回事,于是再重新学习源码,各种比对,发现都是相同的。

  并且这个对象时在插件初次加载的start函数通过getPreferenceStore()进行初始化的。

  那么就奇怪了,一样的代码过程,为什么源码可以查找到值,而我的却不行呢?

  于是查看IPreferenceStore接口的源码,查找它的实现类,并没有任何收获!

  无奈之下,只能百度了!

  

  于是,万能的百度再次立功了,原来是首选项中配置的内容。也就是说与手写的代码其实是分离的,它是在扩展点org.eclipse.core.runtime.preferences中扩展的一个初始化函数。

  知道了原因,那么就好好研究下吧!

  IPregerenceStore

  它是eclipse基于字符串的一个键值存储结构,也就是说,以String类型为主键,存储其他类型。它在插件加载的时候进行执行,并且存储在本地。可以同过getPregerenceStore()获取这个对象,通过setDefault方法进行赋值。

  接下来看一下这个对象的使用方法吧!

  1 在扩展点中扩展org.eclipse.core.runtime.preferences

  2 新建一个 initializer ,并且指定实现一个初始化的类

  3 创建IPreferenceStore对象,并设定初始化值

 1 import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
 2 import org.eclipse.jface.preference.IPreferenceStore;
 3
 4 import testpreference.Activator;
 5
 6 public class AbstractPreferenceInitializer1 extends
 7         AbstractPreferenceInitializer {
 8
 9     public AbstractPreferenceInitializer1() {
10         // TODO Auto-generated constructor stub
11     }
12
13     @Override
14     public void initializeDefaultPreferences() {
15         IPreferenceStore store = Activator.getDefault().getPreferenceStore();
16
17         store.setDefault(Activator.PREF_PARAM_1, "hello");
18         store.setDefault(Activator.PREF_PARAM_2, "xingoo");
19     }
20 }

  4 在Activator中进行初始化【并实现调用】

public class Activator extends AbstractUIPlugin {
    ...
    public static final String PREF_PARAM_1 = "param_1";
    public static final String PREF_PARAM_2 = "param_2";

    private IPreferenceStore store;

    public void start(BundleContext context) throws Exception            {
        super.start(context);
        plugin = this;
        store =getPreferenceStore();

        System.out.println("param1"+store.getString(PREF_PARAM_1));
        System.out.println("param2"+store.getString(PREF_PARAM_2));
    }

    ...
}

  IPreferenceStore的使用过程大致就是如此了!

  总结起来这次调试过程,归结原因,只能算是自己无知了,学无止境!

时间: 2024-08-01 22:45:01

【插件开发】—— 8 IPreferenceStore,插件的键/值存储!的相关文章

如何在嵌入式产品中应用键值存储数据库

[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:[email protected]] 1.背景 随着互联网快速发展及大数据时代的到来,NoSQL数据库以其强大的可伸缩性.高效性.实时性等特点,而获得十足的发展.键值(Key-Value)存储数据库就是NoSQL的一种,大名鼎鼎的Redis就是一款用C开发的开源键值对存储数据库. 与此同时又有越来越多的厂家加入了IoT产品.可穿戴设备.智能家居的嵌入式产品开发行列中来,数据的持久化存储需求也就变得越来越多,选型一款伸缩性好.占用资源小.

SQLite实现内存键值存储

SQLite数据文件往Linux内存文件系统/dev/shm/data.sqlite3一放,就是内存级读写性能的SQL系统.用SQLite实现内存键值存储:CREATE TABLE IF NOT EXISTS memory (  key VARCHAR(40) NOT NULL PRIMARY KEY,  value TEXT NOT NULL,  time INTEGER NOT NULL);INSERT INTO memory (key, value, time) VALUES ('key1

怎样在嵌入式产品中应用键值存储数据库

[ 声明:版权全部.欢迎转载.请勿用于商业用途. 联系信箱:[email protected]] 1.背景 随着互联网高速发展及大数据时代的到来.NoSQL数据库以其强大的可伸缩性.高效性.实时性等特点,而获得十足的发展.键值(Key-Value)存储数据库就是NoSQL的一种,大名鼎鼎的Redis就是一款用C开发的开源键值对存储数据库. 与此同一时候又有越来越多的厂家增加了IoT产品.可穿戴设备.智能家居的嵌入式产品开发行列中来,数据的持久化存储需求也就变得越来越多,选型一款伸缩性好.占用资源

[Swift Weekly Contest 121]LeetCode981. 基于时间的键值存储 | Time Based Key-Value Store

Create a timebased key-value store class TimeMap, that supports two operations. 1. set(string key, string value, int timestamp) Stores the key and value, along with the given timestamp. 2. get(string key, int timestamp) Returns a value such that set(

键值存储之redis

MySQL通过Memcached将热点数据加载到cache,加速访问,但随着业务数据量的不断增加,和访问量的持续增长会遇到很多问题: 1.MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间. 2.Memcached与MySQL数据库数据一致性问题. 3.Memcached数据命中率低或down机,大量访问直接穿透到DB,MySQL无法支撑. 4.跨机房cache同步问题. 如果简单地比较Redis与Memcached的区别,redis会有如下优点:

Key-Value键值存储原理初识(NOSQL)

NO-Sql数据库:Not Only不仅仅是SQL 定义:非关系型数据库:NoSQL用于超大规模数据的存储.(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据).这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展.需要进一步数据挖掘和分析. RDBMS VS NOSQL RDBMS NoSQL 高度组织化结构化数据  代表着不仅仅是SQL 结构化查询语言(SQL) (SQL)  没有声明性查询语言 数据和关系都存储在单独的表中 没有预定义的模式 数据操纵语言,数据定义语言

Aerospike C客户端手册———键-值存储—批量读取记录

批量读取记录 除了每次读取单条记录外,还可以在一个事务中从集群中读取多条记录.相关的客户Aerospike C客户端API调用是: aerospike_batch_get() - 返回所需记录所有bin数据. aerospike_batch_exists() - 返回所需记录元数据(生存时间, 分代编号). 后面的代码引用自示例目录[examples/basic_examples/get],由Aerospike C客户端安装包自带. 请先阅读[创建连接]章节内容,理解如何建立与集群的连接. 初始

[iOS Keychain本地长期键值存储]

目前本地存储方式大致有:Sqlite,Coredata,NSUserdefaults.但他们都是在删除APP后就会被删除,如果长期使用存储,可以使用Keychain钥匙串来实现. CHKeychain.h #import <Foundation/Foundation.h> @interface CHKeychain : NSObject + (void)save:(NSString *)service data:(id)data; + (id)load:(NSString *)service;

Aerospike C客户端手册———键-值存储—删除记录

删除记录 Aerospike C客户端API提供一个简单的操作来删除数据库中的数据. 数据删除示例代码被所有示例使用.下面的代码引用自示例目录[examples/basic_examples/put],由Aerospike C客户端安装包自带. 请先阅读[创建连接]章节内容,理解如何建立与集群的连接. 初始化键(KEY) 删除记录时,数据库需要通过键(key)来标识这条记录.下面我们为示例代码创建一个键.用来做键的是字符串"test-key",数据所在的namespace名称为&quo