如何使用具有自定义文件扩展名的 H2 数据库?
How to use H2 databases with a custom file extension?
我正在构建一个将其数据存储在 H2 数据库文件中的应用程序,因此我的保存文件的扩展名为 .h2.db
。
打开应用程序时,用户必须select应该加载哪个保存文件。为了更容易识别这些文件,是否可以告诉 H2 使用自定义文件扩展名?
看H2的Database URL overview,只能指定数据库名。我更喜欢像 .save
这样的扩展,而不是默认的 .h2.db
。有没有合理的方法来实现这个?
解决方法是 link 将 *.save
文件保存到一个临时文件夹,将其重命名为正确的后缀。如果这是唯一的解决方案,我想我会使用默认扩展名。
不能为H2数据库名(页面文件)定义新的扩展名(后缀)
在我的代码中,我有类似的需求(用户可能 select 数据库),这就是我所做的:
File file=new FileImport(shell, "*"+org.h2.engine.Constants.SUFFIX_PAGE_FILE).filePicker();
if (file!=null){
String database=file.getAbsolutePath().
replace(org.h2.engine.Constants.SUFFIX_PAGE_FILE, "");
...
}
注意:FileImport 是我写的 class 扩展 SWT FileDialog:https://code.google.com/p/marcolopes/source/browse/org.dma.eclipse/src/org/dma/eclipse/swt/dialogs/file/FileImport.java
文件扩展名(注意有很多,不仅仅是 .h2.db
)设置在 Constants.java
:
/**
* The file name suffix of page files.
*/
public static final String SUFFIX_PAGE_FILE = ".h2.db";
并直接在整个代码库中使用,例如在 Database.java
:
/**
* Check if a database with the given name exists.
*
* @param name the name of the database (including path)
* @return true if one exists
*/
static boolean exists(String name) {
if (FileUtils.exists(name + Constants.SUFFIX_PAGE_FILE)) {
return true;
}
return FileUtils.exists(name + Constants.SUFFIX_MV_FILE);
}
所以不,您不能为数据库指定自定义文件扩展名。你最好不要担心这个,或者使用 FileNameExtensionFilter 来限制用户的选择,就像 JoopEggen 建议的那样。
您可以压缩数据库文件并将 .zip
重命名为其他扩展名,例如 .save
。然后解压缩 .save
文件以获取 .h2.db
文件。请注意,这是 Jars 的工作方式 - 它们只是隐藏的 zip 文件。
您也可以查看 Game Developer Stack Exchange,并考虑在那里发布一个问题,例如 "How do I create user-friendly save files" 并描述您的问题,如果您真的不能期望您的用户容忍 .h2.db
文件.
H2 数据库支持可插拔文件系统,因此通过一些额外的代码,您可以使用任何您想要的扩展。您只需要创建一个包装器,注册它并使用您自己的数据库 URL。包装器可能如下所示:
package my.test;
import org.h2.store.fs.FilePath;
import org.h2.store.fs.FilePathWrapper;
public class FilePathTestWrapper extends FilePathWrapper {
private static final String[][] MAPPING = {
{".h2.db", ".save"},
{".lock.db", ".save.lock"}
};
@Override
public String getScheme() {
return "save";
}
@Override
public FilePathWrapper wrap(FilePath base) {
// base.toString() returns base.name
FilePathTestWrapper wrapper = (FilePathTestWrapper) super.wrap(base);
wrapper.name = getPrefix() + wrapExtension(base.toString());
return wrapper;
}
@Override
protected FilePath unwrap(String path) {
String newName = path.substring(getScheme().length() + 1);
newName = unwrapExtension(newName);
return FilePath.get(newName);
}
protected static String wrapExtension(String fileName) {
for (String[] pair : MAPPING) {
if (fileName.endsWith(pair[1])) {
fileName = fileName.substring(0, fileName.length() - pair[1].length()) + pair[0];
break;
}
}
return fileName;
}
protected static String unwrapExtension(String fileName) {
for (String[] pair : MAPPING) {
if (fileName.endsWith(pair[0])) {
fileName = fileName.substring(0, fileName.length() - pair[0].length()) + pair[1];
break;
}
}
return fileName;
}
}
然后你需要注册它:
FilePathTestWrapper wrapper = new FilePathTestWrapper();
FilePath.register(wrapper);
并像这样使用数据库 URL:
"jdbc:h2:save:./mydatabase"
注意 "save:" 前缀,它应该匹配 getScheme() 方法返回的字符串。我在这里放了更多细节:http://shuvikov.net/blog/renaming-h2-database-files
我正在构建一个将其数据存储在 H2 数据库文件中的应用程序,因此我的保存文件的扩展名为 .h2.db
。
打开应用程序时,用户必须select应该加载哪个保存文件。为了更容易识别这些文件,是否可以告诉 H2 使用自定义文件扩展名?
看H2的Database URL overview,只能指定数据库名。我更喜欢像 .save
这样的扩展,而不是默认的 .h2.db
。有没有合理的方法来实现这个?
解决方法是 link 将 *.save
文件保存到一个临时文件夹,将其重命名为正确的后缀。如果这是唯一的解决方案,我想我会使用默认扩展名。
不能为H2数据库名(页面文件)定义新的扩展名(后缀)
在我的代码中,我有类似的需求(用户可能 select 数据库),这就是我所做的:
File file=new FileImport(shell, "*"+org.h2.engine.Constants.SUFFIX_PAGE_FILE).filePicker();
if (file!=null){
String database=file.getAbsolutePath().
replace(org.h2.engine.Constants.SUFFIX_PAGE_FILE, "");
...
}
注意:FileImport 是我写的 class 扩展 SWT FileDialog:https://code.google.com/p/marcolopes/source/browse/org.dma.eclipse/src/org/dma/eclipse/swt/dialogs/file/FileImport.java
文件扩展名(注意有很多,不仅仅是 .h2.db
)设置在 Constants.java
:
/**
* The file name suffix of page files.
*/
public static final String SUFFIX_PAGE_FILE = ".h2.db";
并直接在整个代码库中使用,例如在 Database.java
:
/**
* Check if a database with the given name exists.
*
* @param name the name of the database (including path)
* @return true if one exists
*/
static boolean exists(String name) {
if (FileUtils.exists(name + Constants.SUFFIX_PAGE_FILE)) {
return true;
}
return FileUtils.exists(name + Constants.SUFFIX_MV_FILE);
}
所以不,您不能为数据库指定自定义文件扩展名。你最好不要担心这个,或者使用 FileNameExtensionFilter 来限制用户的选择,就像 JoopEggen 建议的那样。
您可以压缩数据库文件并将 .zip
重命名为其他扩展名,例如 .save
。然后解压缩 .save
文件以获取 .h2.db
文件。请注意,这是 Jars 的工作方式 - 它们只是隐藏的 zip 文件。
您也可以查看 Game Developer Stack Exchange,并考虑在那里发布一个问题,例如 "How do I create user-friendly save files" 并描述您的问题,如果您真的不能期望您的用户容忍 .h2.db
文件.
H2 数据库支持可插拔文件系统,因此通过一些额外的代码,您可以使用任何您想要的扩展。您只需要创建一个包装器,注册它并使用您自己的数据库 URL。包装器可能如下所示:
package my.test;
import org.h2.store.fs.FilePath;
import org.h2.store.fs.FilePathWrapper;
public class FilePathTestWrapper extends FilePathWrapper {
private static final String[][] MAPPING = {
{".h2.db", ".save"},
{".lock.db", ".save.lock"}
};
@Override
public String getScheme() {
return "save";
}
@Override
public FilePathWrapper wrap(FilePath base) {
// base.toString() returns base.name
FilePathTestWrapper wrapper = (FilePathTestWrapper) super.wrap(base);
wrapper.name = getPrefix() + wrapExtension(base.toString());
return wrapper;
}
@Override
protected FilePath unwrap(String path) {
String newName = path.substring(getScheme().length() + 1);
newName = unwrapExtension(newName);
return FilePath.get(newName);
}
protected static String wrapExtension(String fileName) {
for (String[] pair : MAPPING) {
if (fileName.endsWith(pair[1])) {
fileName = fileName.substring(0, fileName.length() - pair[1].length()) + pair[0];
break;
}
}
return fileName;
}
protected static String unwrapExtension(String fileName) {
for (String[] pair : MAPPING) {
if (fileName.endsWith(pair[0])) {
fileName = fileName.substring(0, fileName.length() - pair[0].length()) + pair[1];
break;
}
}
return fileName;
}
}
然后你需要注册它:
FilePathTestWrapper wrapper = new FilePathTestWrapper();
FilePath.register(wrapper);
并像这样使用数据库 URL:
"jdbc:h2:save:./mydatabase"
注意 "save:" 前缀,它应该匹配 getScheme() 方法返回的字符串。我在这里放了更多细节:http://shuvikov.net/blog/renaming-h2-database-files