【插件开发】—— 8 IPreferenceStore,插件的键/值存储!
前文回顾:
1 插件学习篇
4 SWT编程须知
7 SWT布局详解
前几篇讲解了SWT的基本知识。这篇作为穿插,讲述一下工作终于到的一个问题,并且借着这个机会,好好的学习了一下!
先描述下我遇到的问题吧:
由于对插件的了解也并不全面,很多知识点都不知道。学习其他人的开源源码时,我遇到了下面的报错:
org.eclipse.jface.resource.DataFormatException
at org.eclipse.jface.resource.StringConverter.asRGB(StringConverter.java:)
at com.xxxxxx.rcp.dbeditor.util.EditorColorProvider.getToken(EditorColorProvider.java:)
根据报错提示的位置,以及调试发现,是有colorName为空,从而无法进行转换。
public IToken getToken(String prefKey) {
System.out.println(store.getString(prefKey));
Token token = (Token) tokenTable.get(prefKey);
if (token == null) {
String colorName = store.getString(prefKey);
RGB rgb = StringConverter.asRGB(colorName);
token = new Token(new TextAttribute(getColor(rgb)));
tokenTable.put(prefKey, token);
}
return token;
}
追踪堆栈,发现这个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对象,并设定初始化值
import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
import org.eclipse.jface.preference.IPreferenceStore; import testpreference.Activator; public class AbstractPreferenceInitializer1 extends
AbstractPreferenceInitializer { public AbstractPreferenceInitializer1() {
// TODO Auto-generated constructor stub
} @Override
public void initializeDefaultPreferences() {
IPreferenceStore store = Activator.getDefault().getPreferenceStore(); store.setDefault(Activator.PREF_PARAM_1, "hello");
store.setDefault(Activator.PREF_PARAM_2, "xingoo");
}
}
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的使用过程大致就是如此了!
总结起来这次调试过程,归结原因,只能算是自己无知了,学无止境!
【插件开发】—— 8 IPreferenceStore,插件的键/值存储!的更多相关文章
- [Swift]LeetCode981. 基于时间的键值存储 | Time Based Key-Value Store
Create a timebased key-value store class TimeMap, that supports two operations. 1. set(string key, s ...
- LeetCode 981.基于时间的键值存储(C++)
创建一个基于时间的键值存储类 TimeMap,它支持下面两个操作: 1. set(string key, string value, int timestamp) 存储键 key.值 value,以及 ...
- SQLite实现内存键值存储
SQLite数据文件往Linux内存文件系统/dev/shm/data.sqlite3一放,就是内存级读写性能的SQL系统.用SQLite实现内存键值存储:CREATE TABLE IF NOT EX ...
- 用于C# 的异步,持久的键值存储 Akavache 使用
Akavache是一个异步的,持久的(即写入磁盘)键值存储,用于在C#中编写桌面和移动应用程序,基于SQLite3.Akavache非常适合存储重要数据(即用户设置)以及过期的缓存本地数据. 开源 ...
- CockroachDB学习笔记——[译]CockroachDB中的SQL:映射表中数据到键值存储
CockroachDB学习笔记--[译]CockroachDB中的SQL:映射表中数据到键值存储 原文标题:SQL in CockroachDB: Mapping Table Data to Key- ...
- Key-Value键值存储原理初识(NOSQL)
NO-Sql数据库:Not Only不仅仅是SQL 定义:非关系型数据库:NoSQL用于超大规模数据的存储.(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据).这些类型的数据存储不需要固 ...
- PowerDotNet平台化软件架构设计与实现系列(05):ETCD分布式键值存储平台
ETCD目前在PowerDotNet已经被用于注册中心和配置管理(常见的配置中心在PowerDotNet中仅仅是一个小小的模块而已)中,作为基础设施的重要组成部分,ETCD的重要性不言而喻. 本文简单 ...
- [iOS Keychain本地长期键值存储]
目前本地存储方式大致有:Sqlite,Coredata,NSUserdefaults.但他们都是在删除APP后就会被删除,如果长期使用存储,可以使用Keychain钥匙串来实现. CHKeychain ...
- 探索etcd,Zookeeper和Consul一致键值数据存储的性能
这篇博文是探索三个分布式.一致性键值数据存储软件性能的系列文章中的第一篇:etcd.Zookeeper和Consul,由etcd团队所写,可以让我们全面地了解如何评估三个分布式一致存储软件的性能.翻译 ...
随机推荐
- 转:Linux中的内存管理
前一段时间看了<深入理解Linux内核>对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看 ...
- ArcGIS Server启动服务报:ERROR: Unable to start Xvfb on any port in the range 6600 - 6619
http://blog.csdn.net/linghe301/article/details/10094421 今天尝试在Linux环境下安装ArcGIS Server10.2,启动服务碰到一个错误: ...
- 【转】PHP实现系统编程(四)--- 本地套接字(Unix Domain Socket)
原文:http://blog.csdn.net/zhang197093/article/details/78143687?locationNum=6&fps=1 --------------- ...
- vue 配置跨域访问
主要在config->index.js中配置 proxyTable: { ‘/gameapi’: { changeOrigin: true, // target: ‘http://rap.id. ...
- 释怀我的诺亚尔 不用EF框架,完成完美实体映射,且便于维护!(AutoMapper,petapoco)
释怀我的诺亚尔 不用EF框架,完成完美实体映射,且便于维护!(AutoMapper,petapoco) 最近,需要搭建一个新项目,在需求分析时确定数据库中需要创建多个存储过程.所以如果还是用原来E ...
- Linux安全应用之防垃圾邮件server的构建
Linux安全应用之防垃圾邮件server的构建 一.垃圾邮件产生的原因 垃圾邮件(SPAM) 也称作UCE(Unsoticited Commercial Email.未经许可的商业电子邮件)或UBE ...
- 【bzoj1015】【JSOI2008】【星球大战】【并查集+离线】
Description 非常久曾经.在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器.并攻下了星系中差点儿全部的星球.这些星球 ...
- 刚刚做了个文件上传功能,拿来分享一下!(MVC架构及传统架构通用)
文件上传无论在软件还是在网站上都十分常见,我今天再把它拿出来,讲一下,主要讲一下它的设计思想和实现技术,为了它的通用性,我把它做在了WEB.Service项目里,即它是针对服务器的,它的结构是关联UI ...
- Blocks实现代理传值
一.RootViewController: #import "RootViewController.h" #import "SecondViewController.h& ...
- mysql备份及还原
mysql怎样复制数据库?或者说,将数据库拷贝到另外一台机? 按照我的理解,复制数据库,如果是: 1.直接拷贝数据库文件,应该先停数据服务,否则拷不出来.但是,生产机器,哪能说停就停呢? 2.在线拷贝 ...