2015-03-09 2 views
3

Я создаю приложение, которое хранит его данные в файлах базы данных H2, поэтому мои файлы сохранения имеют расширение .h2.db.Как использовать базы данных H2 с пользовательским расширением?

При открытии приложения пользователь должен выбрать, какой файл сохранения должен быть загружен. Чтобы упростить распознавание этих файлов, можно ли указать H2 на использование пользовательских расширений файлов?

Глядя на Database URL overview H2, я могу указать только имя базы данных. Я бы предпочел расширение, например .save по умолчанию .h2.db. Есть ли разумный способ достичь этого?

Обходным путем было бы связать файл *.save со временной папкой, переименовав ее в правильный суффикс. Если это единственное решение, я думаю, что я бы пошел с расширением по умолчанию.

+1

Я бы сказал, что вы не можете использовать другой суффикс. Посмотрите [Макет файла базы данных] (http://www.h2database.com/html/features.html#database_file_layout) и следующую главу «Перемещение и переименование файлов базы данных». В нем указано, что «[переименование возможно], если все файлы одной базы данных начинаются с одного и того же имени, а соответствующие расширения не изменяются». – SubOptimal

+1

По крайней мере, используйте FileNameExtensionFilter с описанием «Сохранить файл (* .h2.db)». –

ответ

0

Вы не можете определить новое расширение (суффикс) для имени базы данных H2 (страничного файла)

В моем коде я иметь подобную потребность (пользователь может выбрать базу данных), и это то, что я делаю:

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 класс прописан мной, который простирается SWT FileDialog: https://code.google.com/p/marcolopes/source/browse/org.dma.eclipse/src/org/dma/eclipse/swt/dialogs/file/FileImport.java

0

расширения имен файлов (уведомление там много, а не только .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 и рассмотреть вопрос о размещении вопроса, например, «Как создать удобные файлы для сохранения» и описать вашу проблему, если вы действительно не можете ожидать, что ваши пользователи будут терпеть файлы .h2.db.

1

База данных 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" 

Примечание "сохранить:" prefix, он должен соответствовать строке, возвращаемой методом getScheme().Я поставил здесь более подробную информацию: http://shuvikov.net/blog/renaming-h2-database-files

Смежные вопросы