2016-08-22 2 views
0

Google Play 스토어에 애플리케이션이 있습니다. 이 응용 프로그램에서는 파일에 일부 데이터를 저장합니다 (데이터베이스는 더 좋지만 더 많은 작업이 필요함). 이것은 완벽하게 작동하지만 문제는 예를 들어 버전 2를 실행하고 파일에 데이터를 저장할 때 다시 가져올 수 있다는 것입니다. 하지만 버전 3으로 업데이트하면 데이터는로드되지 않지만 파일은 여전히 ​​응용 프로그램의 'files'디렉토리에 있습니다. 이 파일은 장치의 내부 저장소에 저장됩니다. 이제는 왜 이런 일이 발생하는지 모르지만 다른 sharedUserId가 원인 일 수 있다는 것을 인터넷에서 읽었지만 내 매니페스트에 sharedUserId가 없습니다. 나는 안드로이드가 그 다음 하나를 생성 할 것이라는 것을 압니다. 그러나 이것은 항상 동일합니까? 앱이 다른 컴퓨터에서 컴파일 되더라도? 누군가 도움을 줄 수 있습니까?업데이트 후 Android 내부 저장소의 파일을 읽을 수 없습니다.

미리 감사드립니다.

편집

내가 파일을 읽고 쓰기 위해 사용하는 일부 코드 :

는 작성하기 :

try { 
      FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE); 
      ObjectOutputStream os = new ObjectOutputStream(fos); 
      os.writeObject(object); 
      os.close(); 

     } catch (IOException e) { 
      LogUtils.e(IoUtils.class.getSimpleName(), e.getMessage()); 
     } finally { 

     } 

읽기 :

try { 
      FileInputStream fis = context.openFileInput(fileName); 
      ObjectInputStream is; 
      is = new ObjectInputStream(fis); 
      Serializable objectOut = (Serializable) is.readObject(); 
      is.close(); 
      return objectOut; 
     } catch (StreamCorruptedException e) { 
      LogUtils.e(IoUtils.class.getSimpleName(), e.getMessage()); 
     } catch (IOException e) { 
      LogUtils.e(IoUtils.class.getSimpleName(), e.getMessage()); 
     } catch (ClassNotFoundException e) { 
      LogUtils.e(IoUtils.class.getSimpleName(), e.getMessage()); 
     } 
     return null; 

를 업데이트 한 후 아무 것도 그 파일에서 벗어나는 것 같지만 아무 것도 얻지 못합니다. 오류. ROOT 파일 탐색기를 사용하면/data/data/myApp/files /로 이동할 수 있으며 업데이트 전에 동일한 크기의 파일을 찾을 수 있습니다.

+0

"안드로이드가 생성 할 것이라는 것을 안다.하지만이 것은 항상 같은 것입니까?" 네, 주어진 장치에 대해서요. "앱이 다른 컴퓨터에서 컴파일 되더라도?" - 그래, 이건 중요하지 않아. Android는 개발 도구가 아닌 사용자 ID를 만드는 앱입니다. 이 장치의 제조사 및 모델은 무엇입니까? – CommonsWare

+0

2 개의 장치에서 테스트 한 결과 두 제품 모두에 문제가 발생했습니다. – Allinone51

+0

OK ... 다음은 어떤 제품과 모델입니까? – CommonsWare

답변

1

사용자 정의가없는 Serializable은 객체 버전이 앱 버전간에 변경 될 수 있으므로 장기 저장에는 사용하지 않아야합니다. 새 버전의 객체 (또는 라이브러리 객체가 변경됨)에 하나의 변수를 추가했다고 가정하고 Serializable이 파손되었습니다.
은 당신이해야 할 것은, 이전 데이터를 검색하려면 덮어 쓰기 기능

private void writeObject(java.io.ObjectOutputStream out) throws IOException` 

private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException; 

private void readObjectNoData() throws ObjectStreamException; 

에 의해 사용자 정의 직렬화를 사용하여 정확히 이전 형식을 읽을 수 직렬화를 변경할 수 있습니다. 앞으로 직렬화에 대한 버전 식별자를 넣어 두어 올바르게 읽을 수 있도록해야합니다.
이 모든 작업이 매우 복잡하고 대개 json (또는 XML) 저장 작업이 훨씬 더 강력합니다.

+0

나는 그것을 조사 할 것이다! 감사합니다 – Allinone51

+0

패키지 이름이 2 개의 업데이트 사이에서 변경 되었습니까? 원인 일 수 있습니까? – Allinone51

+0

파싱 할 수있는 객체를 파일에 저장할 수 있습니까? – Allinone51