2010-06-23 5 views
2

최대 절전 모드로 응용 프로그램 설정을 저장하는 가장 좋은 방법은 무엇입니까?최대 절전 모드로 응용 프로그램 설정 유지하기

단일 행 테이블을 사용할 방법이 있습니까? 아니면 더 좋은 방법이 있습니까? 같은 위치/테이블에 추가 설정을 저장할 수 있지만 응용 프로그램 도메인 외부에서는 좋은 기능입니다.

내가 예를 들어, 키/값 테이블을 실험했습니다

Key  | Value 
------------------------- 
width | 20px 
height | 40px 
showall | true 
etc. 

그러나 이것은 아주 잘 최대 절전 모드에 맞게 보이지 않는다.

아이디어가 있으십니까?

+0

정말 SQL 데이터베이스에 저장할 필요가 있습니까? 이 데이터를 다른 데이터와 결합하여 다른 응용 프로그램 등에서 쿼리 할 수 ​​있습니까? 아니면 그것을 저장하는 가장 편리한 장소입니까? –

+0

대부분의 경우, 아니오라고 말하고 싶습니다. 그러나이 경우에는 동일한 데이터베이스에 대해 서로 다른 두 가지 응용 프로그램 (다른 컴퓨터)을 사용하고 있습니다. –

답변

1

사실 nHibernate 수와 C#에서 키/값 쌍으로 이것을 구현했습니다. 표는 키/값 쌍으로 설명한 것과 동일합니다. 값을 가져 오거나 설정할 때 내 영속 계층은 "키"(열거 형)를 받아들이고 ApplicationSetting 객체를 반환합니다. 이 객체는 실제로 키/값 쌍에 대한 래퍼입니다.

간단한 예제 (C#에서) :

class ApplicationSetting 
{ 
    private string theApplicationSettingString = string.Empty; 

    /// <summary> 
    /// The name of the setting. 
    /// </summary> 
    public virtual ApplicationSettingKey SettingName 
    { 
    //I use enumerations here so that I'm guaranteed to get a key I 
    //already know about and not a random string. 
    get 
    { 
     return (ApplicationSettingKey)Enum.Parse(
      typeof(ApplicationSettingKey), theApplicationSettingString); 
    } 
    set 
    { 
     theApplicationSettingString = 
      Enum.GetName(typeof(ApplicationSettingKey), value); 
    } 
    } 

    /// <summary> 
    /// The value of the setting. 
    /// </summary> 
    public virtual string SettingValue 
    { 
    get; 
    set; 
    } 
} 



/// <summary> 
/// Enumeration for all application settings. 
/// </summary> 
public enum ApplicationSettingKey 
{ 
    WIDTH, 
    HEIGHT, 
    SHOWALL 
} 


/// <summary> 
/// Returns the ApplicationSetting from the database that corresponds to 
/// the passed in key/name. 
/// </summary> 
/// <param name="aKey">The key/name of the Application setting to 
/// retrieve.</param> 
/// <returns>The ApplicationSetting Definition that with the corresponding 
/// application setting key/name.</returns> 
public ApplicationSetting GetApplicationSettingByKey(ApplicationSettingKey aKey) 
{ 
    const string propertyName = "theApplicationSettingString"; 
    string key = Enum.GetName(typeof(ApplicationSettingKey), aKey); 
    DetachedCriteria criteria = DetachedCriteria.For<ApplicationSetting>(); 
    criteria.Add(Restrictions.Eq(propertyName, key)); 
    return FindFirst(criteria); 
} 
+0

필자는이 방법을 사용하여 끝내지 만 결정을 내리기 전에 다른 기존 기술뿐만 아니라 여기에 제시된 다른 모든 솔루션을 평가하기 위해이 책을 읽는 사람에게 권장합니다. –

+0

@Kristoffer 나는 다른 사람들이 모든 해결책을 찾아야한다는 것에 완전히 동의한다. 이 솔루션은 프로젝트의 다른 부분과 잘 어울리므로 내 프로젝트를 위해 선택되었습니다. – brainimus

+0

모든 유형을 문자열로 저장하는 것은 오류가 발생하기 쉬운 방법입니다. 유형을 올바르게 매핑하는 데 ORM 기능을 사용하는 것이 좋습니다. 따라서 각 설정 키에 대해 적절한 유형으로 별도의 열을 만드는 것이 좋습니다. 그리고 분명히 다중 설정 행 생성을 막아야합니다. – Sneg

2

값을 사용하는 방법에 따라 도메인 모델을 구성한 다음 (해당 OO 모델을 구성하는 방법과 유사) 해당 엔터티를 유지하는 것이 좋습니다. 예를 들어, width, heightshowall 속성을 가진 Window 개체를 가지면 데이터베이스에 단일 행/개체로 유지됩니다. 다음 (가상 상황)을 가질 수

이 방법 :

id | layoutType | width | height | images 
----------------------------------------------- 
0 | widescreen | 1000 | 500 | true 
1 | normal  | 600 | 500 | true 
2 | mobile  | 320 | 480 | false 
2

엄격하게 귀하의 질문에 대답하기 위해, 당신 최대 절전 모드로 키/값 테이블에 매핑 할 수 있습니다 :

@Entity 
public class Settings { 
    @Id 
    private String key; 
    private String value; 

    // getters, setters, etc 
} 

을하지만 당신은 정말 필요 여부 이 데이터베이스에 저장 여부, 나는 최대 절전 모드 대신 Commons Configuration (또는 어쩌면 Properties 개체 개체에 갈 거라고 생각합니다. 데이터베이스에 persps 수 설정이 필요하지 않은 경우 Preferences API는 @ring에서 제안한대로).

+0

대신'java.util.Preferences' 기반 API –

+0

@ring 좋은 지적, 답변 됨, 감사합니다. –

관련 문제