【插件开发】—— 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团队所写,可以让我们全面地了解如何评估三个分布式一致存储软件的性能.翻译 ...
随机推荐
- java课堂测试—根据模板完成一个简单的技术需求征集系统
课堂上老师发布了一个页面模板要求让我们实现一个系统的功能,模仿以后后端的简单工作情况. 然后在这个模板的基础上,提供了一个注册的网页模板,接着点击注册的按钮,发现register里面调用了zhu/zh ...
- 从头开始学Android之(二)—— Android版本
前面大致的介绍了一下Android的Linux内核层,知道Android是Google在Linux基础上创建的一个应用于移动设备的系统,并在针对移动设备的特殊性,在Linux上做了一些相应的改动建立起 ...
- 判断所ping主机的操作系统
根据它的值判断所ping主机的操作系统类型. TTL被称为生存期,也就是你所传输的数据在网络上经过的路由器的最大个数. 操作系统 TTLLINUX 64WIN2K/NT 128WINDOWS 系列 3 ...
- Bound mismatch: The typae CertificateDirectory is not a valid substitute for the bounded parameter <M extends Serializable>
这是因为架包没导对或者关联的项目不是在同一个工作空间.
- Linux性能诊断工具
vmstat:虚拟内存状况 –swpd free buff cache si so in cs 參考:http://www.cnblogs.com/ggjucheng/archi ...
- VC++ 2010编译错误 fatal error C1189 error This file requires _WIN32_WINNT to be #defined at least
打开你的C++工程,找到里面的stdafx.h文件,然后把下面的红色内容替换成绿色的 参考:http://blog.csdn.net/dongliqiang2006/article/details/5 ...
- 万恶之源:C语言中的隐式函数声明
1 什么是C语言的隐式函数声明 在C语言中,函数在调用前不一定非要声明.如果没有声明,那么编译器会自己主动依照一种隐式声明的规则,为调用函数的C代码产生汇编代码.以下是一个样例: int main(i ...
- activiti自己定义流程之自己定义表单(一):环境配置
先补充说一下自己定义流程整个的思路,自己定义流程的目的就是为了让一套代码解决多种业务流程.比方请假单.报销单.採购单.协作单等等.用户自己来设计流程图. 这里要涉及到这样几个基本问题,一是不同的业务需 ...
- 程序C++ to C#交互
第一次用C#调用C/C++生成的DLL文件,感觉有点新鲜,事实上仅仅是实现了执行在公共语言执行库 (CLR) 的控制之外的"非托管代码"(执行在公共语言执行库(CLR)的控制之中的 ...
- Android NDK编程浅入深出之--Android.mk
Android.mk Android.mk是一个向Android NDK构建系统描写叙述NDK项目的GUN Makefile片段.它是每个NDK项目的必备组件. 构建系统希望它出如今jni子文 ...