티스토리 뷰

반응형

앱에서 환경 설정 데이터를 저장하는 방법과 불러오는 방법을 설명하도록 하겠다. 사용된 소스는
http://kaki104.tistory.com/104
포스트에 있는 KMusic Player 소스를 사용한다.

1. 저장하기
suspensionManager는 MS의 Sample 프로젝트에 포함되어 있는 클래스인데, 서스펜션 모드로 넘어갈 때 사용 중이던 데이터를 저장하는 용도로 사용 하는데, 몇개의 메소드를 추가해서 데이터를 저장하고 불러오는 용도로 사용할 수 있다.

SuspensionManager.SaveSetting() 메소드를 이용해서 저장할 데이터를 입력하고, SuspensionManager.SaveAsync() 메소드를 호출해서 저장을 할 수 있고, 이곳을 통해서 저장을하면, Collection 객체와 같은 데이터들을 Serializer를해서 저장을 해준다.

SaveSetting 호출 시 입력하는 데이터의 타입을 꼭 넣어 주어야만 저장이 가능하고, 타입은 일반적으로 사용자가 만들은 Model정도를 저장하기 적합하다.

    /// <summary>
    /// 저장
    /// </summary>
    static public void SaveSetting(Type type, string key, object data)
    {
        if(SuspensionManager.KnownTypes.Count(p => p is Type) == 0)
            SuspensionManager.KnownTypes.Add(type);

        if(SuspensionManager.SessionState.Count(p => p.Key == key) == 0)
            SuspensionManager.SessionState.Add(key, data);
        else
            SuspensionManager.SessionState[key] = data;
    }


    // Save the current session state
    static async public Task SaveAsync()
    {
        // Get the output stream for the SessionState file.
        StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
        IRandomAccessStream raStream = await file.OpenAsync(FileAccessMode.ReadWrite);
        using (IOutputStream outStream = raStream.GetOutputStreamAt(0))
        {
            // Serialize the Session State.
            DataContractSerializer serializer = new DataContractSerializer(typeof(Dictionary<string, object>), knownTypes_);
            serializer.WriteObject(outStream.AsStreamForWrite(), sessionState_);
            await outStream.FlushAsync();
        }
    }

2. 불러오기
RestoreSetting() 메소드를 이용해서 불러올 데이터의 타입을 입력하고, RestoryAsync() 메소드를 이용해서 불러들인 후 GetData() 메소드를 이용해서 Object에 입력한다.

    /// <summary>
    /// Type 입력
    /// </summary>
    /// <returns></returns>
    static public void RestoreSetting(Type type)
    {
        SuspensionManager.KnownTypes.Add(type);
    }

    // Restore the saved sesison state
    static async public Task RestoreAsync()
    {
        // Get the input stream for the SessionState file.
        try
        {
            StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(filename);
            if (file == null) return;
            IInputStream inStream = await file.OpenSequentialReadAsync();

            // Deserialize the Session State.
            DataContractSerializer serializer = new DataContractSerializer(typeof(Dictionary<string, object>), knownTypes_);
            sessionState_ = (Dictionary<string, object>)serializer.ReadObject(inStream.AsStreamForRead());
        }
        catch (Exception)
        {
            // Restoring state is best-effort.  If it fails, the app will just come up with a new session.
        }
    }

    static public object GetData(string key)
    {
        object returnValue = null;
        if (SessionState.ContainsKey(key) == true)
            returnValue = SessionState[key];
        return returnValue;
    }

3. 사용 예제

MainPageViewModel.cs

//현재 플레이리스트 파일명과 폴더명을 저장한다.
SuspensionManager.SaveSetting(typeof(string), "CurrentPlaylistFileName", CurrentPlaylistFileName);
SuspensionManager.SaveSetting(typeof(string), "currentPlaylistFolderName", currentPlaylistFolderName);
await SuspensionManager.SaveAsync();

//타입을 입력하고
SuspensionManager.RestoreSetting(typeof(string));
//불러오기 하고
await SuspensionManager.RestoreAsync();
//플레이리스트 파일명과, 폴더명을 가지고 온다.
var filename = SuspensionManager.GetData("CurrentPlaylistFileName") as string;
var foldername = SuspensionManager.GetData("currentPlaylistFolderName") as string;
var songindex = SuspensionManager.GetData("currentSongIndex") as string;

 

반응형
댓글