안드로이드 로컬 데이터 저장 방안 (1)

6858 단어
안드로이드 시리즈의 블로그는 주로 자신이 평소에 공부하면서 겪은 문제를 기록하고 정리하여 나중에 사용할 때 편리하게 볼 수 있도록 하는 동시에 독자들에게 도움을 주기를 바란다.부족한 점 지적 환영합니다~
안드로이드 데이터 저장에 대해 말하기 전에 데이터 지속화를 말하자면 데이터 지속화란 메모리에 있는 순간적인 데이터를 저장하는 것으로 응용 개발에서 매우 중요한 부분이다.밤을 들어 우리가 앱을 열고 사용자 이름과 비밀번호를 입력한 후에 데스크톱으로 돌아왔고 다시 앱으로 돌아왔을 때 우리가 입력한 내용이 그대로 있기를 바랐는데 이걸 어떻게 실현해야 하나요?데스크톱으로 돌아갈 때 데이터를 저장하고 보기로 돌아갈 때 데이터를 채울 수 있습니다.
사실 이러한 순간 데이터의 저장뿐만 아니라 일부 응용과 관련된 데이터도 저장해야 한다. 예를 들어 사용자가 처음 로그인한 후에 다시 응용에 들어가면 다시 로그인할 필요가 없다. 그러면 사용자의 정보는 저장해야 한다.다음은 본론으로 들어가겠습니다.
참고: 데이터 지속성은Activity의 라이프 사이클과 함께 사용해야 합니다.
Android 로컬 데이터 저장소에는 다음과 같은 몇 가지 방법이 있습니다.
  • SharedPreferences: 사용자 선호 설정
  • 내부 저장, 핸드폰 내장 저장
  • 에 데이터 저장
  • 외부 스토리지, 외부 SD 카드에 데이터 저장
  • SqlLite 로컬 데이터베이스 저장소
  • ContentProvider

  • 그 중에서 내부 저장과 외부 저장은 모두 파일 저장에 속하는데 이번에는 주로 Shared Preferences와 내부 저장을 소개한다.
    1. SharedPreferences: 사용자 선호 설정
    Shared Preferences는 키 값을 사용하여 데이터를 저장합니다. 기본적으로 xml 파일 형식으로 저장됩니다. 대응하는 파일은 핸드폰 메모리의 데이터//xxx(데이터를 저장할 때 만든 파일) 디렉터리 아래에 저장하고putString(),putInt(),putBoolean() 등 방법으로 서로 다른 유형의 데이터를 저장하여 사용하기에 편리합니다.
    Shared Preferences가 저장할 때의 데이터 형식과 데이터 형식이 제한되어 있기 때문에 사용자가 설정한 야간 모드, 음량, 로그인 정보 등 간단한 사용자 설정만 저장할 수 있습니다.
    SharedPreferences를 가져오는 방법
    Android는 SharedPreferences 객체를 가져오는 3가지 방법을 제공합니다.
    1) Context 클래스의 getsharedPreferences () 방법
    인자: getsharedPreferences () 는 다음과 같은 두 가지 인자 String 형식이 필요합니다: 파일 이름 지정 (파일 접미사 필요 없음) int 형식: 파일의 조작 모드를 지정합니다. 주로 MODEPRIVATE, MODEAPPEND, MODEMULTI_PROCESS.
    2) Activity 클래스의 getPreferences () 방법
    매개 변수: 하나의 조작 모드 매개 변수만 수신합니다.이 메서드는 현재 활성 클래스 이름을 Shared Preferences의 파일 이름으로 자동으로 사용합니다.
    3)Preference Manager 클래스의 getDefaultSharedPreferences () 방법
    이것은 정적 방법입니다. Context 파라미터를 받아서 현재 프로그램의 패키지 이름을 접두사로 SharedPreferences 파일을 자동으로 지정합니다.
    다음은 코드 사례(로그인 정보를 저장하는 경우):SharedPreferences 대상 가져오기
    preferences = getSharedPreferences("login",MODE_PRIVATE);
    

    사용자 로그인 정보 저장
    //  editor  
        SharedPreferences.Editor editor = preferences.edit();
       //              
        editor.putString("userId",user.getUserId());
        editor.putString("username",user.getUserName());
        editor.putString("password",user.getPassword());
        editor.putString("role",user.getUserRole());
        //      
        editor.commit();
    

    데이터를 체크 아웃하려면 먼저 SharedPreferences 객체를 가져와야 합니다.
    //    ,          ,     -->   key   ,     ,         ""
        String userId = preferences.getString("username","");
        String password = preferences.getString("password","");
        String role = preferences.getString("role","");
    

    2. 파일 스토리지
    파일 저장의 형식은 파일에 대해 어떠한 포맷 처리도 하지 않는다. 저장이 어떤 것인지, 꺼내는 것도 어떤 것인지. 우리는 그것으로 간단한 유형의 데이터나 이진 데이터를 저장할 수도 있고, 스스로 저장 규범을 정의하여 복잡한 텍스트 데이터를 저장할 수도 있다.사실 우리는 json 형식의 데이터를 파일에 직접 저장할 수 있고 Gson 클래스를 빌려 대상과 json 형식 간의 변환을 할 수 있어 사용하기에 매우 편리하다.지난번에 저는 응용 프로그램에서 파일로 데이터를 캐시했습니다. SQLlite보다 파일 저장이 편리할 때가 있습니다. 데이터베이스를 만들거나 테이블을 만드는 등의 작업을 하지 않기 때문입니다.
    내부 저장: Context는 파일을 쉽게 열 수 있는 방법을 제공합니다.Context 클래스에서 제공하는 OpenFile Output () 와 OpenFile Input () 을 사용하여 파일을 쓰고 읽을 수 있으며, 캐시를 설정하고 읽을 수 있습니다. 여기서 들어오는 파일 이름은 파일 접미사가 달려 있습니다.주의: 읽기와 쓰기가 파일일 때 읽기와 쓰기 버퍼를 추가하여 읽기와 쓰기의 효율을 높일 수 있습니다.
    다음은 파일 저장의 내부 저장 예(저장 문자열을 예로 들면)입니다. 나중에 사용하기 편리하도록 파일 캐시 도구 종류를 정의할 수 있습니다.
    public class FileCacheUtil {
        //         ,      
        public static final String docCache = "docs_cache.txt";//    
        //      
        public static final int CACHE_SHORT_TIMEOUT=1000 * 60 * 5; // 5   
    
        /**    
        content       ,        ,       。
        */
        public static void setCache(String content,Context context, String cacheFileName,int mode) {
            FileOutputStream fos = null;
            try {
                //       ,           
                fos = context.openFileOutput(cacheFileName,mode);
                fos.write(content.getBytes());
             } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if(fos != null) {
                    try {
                        fos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
        //    ,     (JSON)
        public static String getCache(Context context, String cacheFileName) {
            FileInputStream fis = null;
            StringBuffer sBuf = new StringBuffer();
            try {
                fis = context.openFileInput(cacheFileName);
                int len = 0;
                byte[] buf = new byte[1024];
                while ((len = fis.read(buf)) != -1) {
                    sBuf.append(new String(buf,0,len));
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                if(fis != null) {
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            if(sBuf != null) {
                 return sBuf.toString();
            }
            return null;
        }
    
        public static String getCachePath(Context context) {
            return context.getFilesDir().getAbsolutePath();
        }
    }
    

    파일 캐시 도구 클래스를 사용할 때 대외적으로 제공된 함수를 직접 호출하면 된다. 필요한 데이터를 문자열로 저장할 수 있다. 우리는 데이터 저장 형식을 사용자 정의할 수 있다. 예를 들어 JSON 직렬로 저장할 수 있다.상기 코드에서 캐시 파일 이름은 파일 캐시 클래스에 쓰이며 사용할 때 바로 호출할 수 있습니다.
    알림:Activity의 onResume () 방법에서 캐시를 가져오는 작업 (Activity와 결합해서 볼 때) 을 사용할 수 있으며, onPause () 에서는 캐시를 설정하는 작업 (일시 정지, 다른 Activity로 이동할 때 이 방법을 사용합니다.
    응용 프로그램에서 우리는 네트워크가 있는지, 캐시가 만료되었는지 여부에 따라 파일에서 캐시 데이터를 얻었는지 판단할 수 있다.다음은 캐시 만료 여부를 판단하는 방법입니다.
    //        ,          
    private boolean cacheIsOutDate(String cacheFileName) {    
        File file = new File(FileCacheUtil.getCachePath(mContext) + "/" 
                     + cacheFileName);    
        //             ,              
        long date = file.lastModified();    
        long time_out = (System.currentTimeMillis() - date);    
        if (time_out > FileCacheUtil.CACHE_SHORT_TIMEOUT) {           
            return true;    
        }       
        return false;//   
    }
    

    총결산
    마지막으로 Context에서 내부 저장과 외부 저장 파일 경로를 가져오는 방법을 총괄해 봅시다.이러한 디렉토리의 파일은 제거가 적용됨에 따라 삭제됩니다.context.getFilesDir (): 휴대전화 내장 메모리의/data/data/files 디렉터리를 가져오고 이 위치에 저장 파일을 놓으십시오.context.getCacheDir (): 휴대전화 내장 메모리의/data/data//cache 디렉터리를 가져옵니다. 이 디렉터리는 응용 캐시 파일을 저장할 수 있습니다.context.getExternal FilesDir ():SDCard/Android/data/응용 프로그램의 패키지 이름/files/디렉터리를 가져옵니다. 외부 저장 디렉터리입니다. 외부 저장을 사용할 때 외부 저장 미디어가 존재하는지 판단하고, 응용 권한에 sd카드에 대한 읽기와 쓰기를 추가해야 합니다.
    //    SD     ,true   
    Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)

    좋은 웹페이지 즐겨찾기