2012-10-03 3 views
3

나는 "정적 설정"데이터가 미리로드되고 편집 가능해야하는 안드로이드 앱이 있습니다. 이 데이터는 관계형입니다. 앱의 기능이 향상되는 동안 아마도 시간이 갈수록 바뀔 것입니다.안드로이드 애플 리케이션을위한 데이터를 미리로드하기위한 훌륭하고 우아하고 안전한 방법

주위를 둘러보기 미리 sqlite3 db 파일을 준비한 다음 일반적인 db 디렉토리 (/data/data/whateverapp/databases/preloaded.db)에 코드를 배치하는 방법을 살펴 보았습니다. 하지만이 방법을 사용하면 루트 권한 (즉, 뿌리깊은 전화)을 가진 사람이 데이터를 입력하고 편집 할 수 있습니다. 그리고 db 파일을 암호화/해독해야하는 것은 번거롭고 혼란 스러울 수 있습니다 (이 afaik를 구현할 원시 메소드가 없습니다).

정적 데이터 목록이있는 클래스를 작성하라는 제안을 보았습니다. 어느 것이 효과가 있을지 모르지만 다소 지저분하고 우아한 것도 아닙니다.

그럼,이를 달성하는 데 정확하고 우아하고 안전한 방법은 무엇입니까?

+5

아, 안전한 질문입니다. 하루에 한 번 이상 올 수 있습니다! 짧은 대답, 당신은 할 수 없습니다. 장치의 데이터로 할 수있는 최선의 방법은 개인 키/해시/소금/알고리즘의 수명을 obsfucate하여 암호화하는 것입니다. 내가 뿌리를 가지고 있다면 (그리고 나는 항상 그렇다) 유일한 질문은 "보상에 가치가있는 분노 비용인가?"이다. 이렇게하는 방법에 대해 많은 논의가 여기에 있습니다. 추신. 보안에 관한 한 SQLite와 임베디드 정적 데이터는 차이가 없습니다. 얼마나 많은 농구가 나를 뛰어 넘는 지에 따라, 쉽거나 어렵습니다. – Simon

+0

나는 깨는 방법이 아니라 obsfucate하는 방법에 대해 많은 토론을했다.) – Simon

+0

그래도 질문의 "보안"부분은 그렇다. 그것은 그것을 스스로 암호화하는 것 같습니다. 하지만 적어도 내 애플 리케이션의 경우에는 DB를 수정하면 아마도 노력 가치가 없다고 말하면, 그것은 단지 자신을 위해 올바르게 작동하지 않을 것입니다. 나는 더 좋은 우아함 부분에 더 관심이 있습니다. 어쩌면이 미리로드를 올바르게 수행 할 API가 있습니다. –

답변

1

많은 : 첫 번째 실행에 등 응용 프로그램, 추출 및 업데이트 DB의 자원뿐만

  • 번들을
  • 서버에서
  • 다운로드, 데이터 업데이트에 대해 알리기 위해 GCM을 사용 . 데이터가 변경 될 때 전체 앱을 업데이트 할 필요가 없습니다.
  • Google Play 확장 (또는 확장 파일 이었습니까?) 파일을 사용합니다. 데이터가 Google 서버에서 다운로드되면 앱이 인증을 받아야합니다. 새로운 앱 버전을 밀어 데이터를 업데이트해야합니다.
  • 은 한 곳, 원격 API를 사용하여

우아함은 주관적이다 원시 데이터를 처리 잊어.

0

내 권장 사항은 서버 기반 데이터베이스를 사용하고 엄격한 보안을 사용하여 사용자가 서버에 액세스 할 수있게하는 것입니다. 액세스 코드를 안전하게 암호화하고 난독 화하고 사용자 자격 증명을 보호한다면 익숙하지 않은 해커를 보호하고 뿌리 전화에 대해 걱정할 필요가 없습니다. DB는 전화조차도 아니기 때문입니다. 코멘트에서 언급했듯이, 해커들은 매우 영리 해졌지만, 이것이 당신의 코드를 더 열심히 만들지 못하게해서는 안됩니다.

1

정의 된 XML 리소스가있는 구성 파일 만 있으면됩니다. 나는 이것을했고 꽤 잘 작동한다. 이렇게하면 여러 구성이있는 경우 이전 버전에서 작동하도록 이러한 구성 파일을 백업 할 수 있습니다. 지금까지 내가 아는 한, 이러한 리소스를 프로그래밍 방식으로 편집 할 수 있다고 생각하지 않습니다.

다음은 간단한 사용 예입니다. 즉 :

매니페스트 :

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="blah.blah" 
     android:versionCode="@integer/version_code" 
     android:versionName="@string/build_version"> 

내 자원 파일 :

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <integer name="version_code">1</integer> 
    <string name="build_version">1.0</string> 
     <string name="param">Some other Param</string> 
</resources> 

지금 당신의 프로그램이 버전 코드 및 버전 이름에 대한 런타임에 리소스를 얻을 수있을 것입니다. 응용 프로그램이 그래서에서 OnCreate에서 그럼 당신은 단지 구성 개체를 만들 수 있습니다

public class Configuration { 
Context thisContext; 
private String Param = ""; 

    public Configuration(Context cont){ 
     thisContext = cont; 
     String param= thisContext.getResources().getString(R.string.param); 

     setParam(param); 
    } 

    /** 
    * @return the param 
    */ 
    public static String getParam() { 
     return Param; 
    } 
    /** 
    * set the Param 
    */ 
    public static void setParam(String param) { 
     Param= param; 
    } 
} 

:

new Configuration(this); 

을 그리고 나중에 당신이 기능을 사용할 수 있습니다 프로그래밍 다음과 같은 코드를 사용할 수있는 다른 값을 얻으려면

Configuration.getParam(); 

값을 얻으려는 모든 클래스에서.

다양한 매개 변수를 써야하지만 매우 간단합니다.

이전 버전을 참조해야하는 경우 구성 파일을 교체하는 것만 큼 간단합니다.

잘하면이 도움이됩니다. 건배

이 할 수있는 방법의
+0

답변 해 주셔서 감사합니다. 리소스 파일 사용에 대해 알고있었습니다. 나는 그들을 꽤 많이 사용했다. 국제화/지역화를 위해 특별히 가치있는 레이블 및 메시지에 유용합니다. 그러나 나는 조금 더 복잡한 데이터 (엔티티, 필드 및 관계 ... ...)를 의미했습니다. (매우 간단한) 예제는 ... 미리 질문과 질문 유형을로드하려는 퀴즈 응용 프로그램을 상상해보십시오. , 응답 유형, 필드 유형, ... 각각의 필드와 관계가 있습니다. –

관련 문제