2011-02-28 5 views
1

동료 프로그래머! 나는 새로운 ... 당신이 도울 수 있기를 바랍니다!Android : 데이터베이스에 이미지에 대한 변경되지 않은 참조를 저장하는 중

So. 현재 사용자가 내 res/drawable/폴더에 저장 한 이미지 세트에서 네 가지 이미지를 선택한 다음 해당 항목을 데이터베이스의 항목으로 저장할 수있는 응용 프로그램을 개발 중입니다. 그러나 사용자가 이미지를 요청할 때 이미지 4 개를 다시 표시 할 수 있어야하며, 이미지를 저장하는 가장 좋은 방법은 현재 설정이 이후에 나에게 적합하지 않기 때문입니다.

지금 당장은 각 이미지에 대해 데이터베이스에 R.java int 식별자를 실제로 삽입하므로 데이터베이스에 img1 (int), img2 (int), img3 (int), img4 (int). 그런 다음 쿼리를 작성할 때 R.drawable.someImage 대신 해당 값을 사용합니다.

잘 작동합니다. 제외 ... 내 res/drawable 폴더에 새 이미지를 추가하면 모든 drawable ID가 변경됩니다! 그런 다음 데이터베이스에있는 ID가 잘못되어 일부는 잘못된 이미지를 가져오고 일부는 NullPointerExceptions를 throw합니다.

사용자가 다운로드 한 후에 새로운 이미지로 앱을 업데이트 할 수 있기 때문에 문제가됩니다. 동적으로 선택할 수 있도록 이미지를 저장하는 방법은 무엇입니까? 그렇지만 다시 참조 할 수 있습니까?

답변

0

리소스는 원시 데이터로 액세스 할 수 있습니다. AssetManager.open(..) 다음으로 BitmapFactory.decodeStream(..)을 사용하여 데이터 스트림에서 비트 맵을 생성 할 수 있습니다.

위의 명령을 통해 이미지의 파일 이름을 저장하고 비트 맵을 인스턴스화 할 수 있습니다.

+0

AssetManagers의 기능에 대해 조금 자세히 설명해 주시겠습니까? 물론 API를 살펴 봤지만 어쨌든 다른 프로그래머보다 더 오래 걸립니다. 기본적으로 이미지를 원시 데이터로 저장하고 AssetManager를 사용하여 해당 데이터에 액세스 할 때 식별자가 필요 없다고 말하고 있습니까? 당신의 도움을 주셔서 감사합니다! – Haley

+0

AssetManager : 응용 프로그램의 원시 자산 파일에 대한 액세스를 제공합니다. 따라서 모든 리소스/자산 파일 (비트 맵, XML)을 원시 데이터 스트림으로 열 수 있습니다. 실제로 이것은 귀하의 경우와 같이 이미지에만 유용합니다. –

+0

특정 방식으로 이미지를 저장할 필요가 없습니다. 이미지를 그대로 유지합니다 (* .png 파일). AssetManager에 이름 (예 : "drawable/image.png") 만 지정하면 데이터 스트림이 반환됩니다. 파일을 열고 파일에서 데이터를 읽는 것과 같습니다. –

1

사용자가 다운로드 한 후 새로운 이미지로 앱을 업데이트 할 수 있기 때문에 문제가됩니다.

나는 이것을 이해하지 못한다. 사용자가 앱을 다운로드 한 후에 새로운 이미지를 배포하려고한다면, 새로운 이미지는 자원 ids (R.java에있는)를 가지지 않을 것이다. 이들은 빌드 프로세스의 일부로 자동 생성됩니다.

정말이 뜻입니까, 아니면 앱을 새로운 이미지로 업데이트하고 사용자가 다시 다운로드하게 하시겠습니까?

는 정기적으로 새로운 이미지와 응용 프로그램을 업데이트하고 사용자가 업데이트 된 응용 프로그램을 다운로드해야하기 위하여려고하는 경우에, 당신은 사용하여 런타임에서 자원 ID를 찾을 수 있습니다

...이 시점에서

int resId = getResources.getIdentifier("img1", "drawable", "com.mycompany.mypackagename"); 

물론 res/values ​​/ strings.xml의 문자열 배열을 사용하여 수행 할 수 있지만 모든 drawable의 이름을 알아야합니다.

그러나 사용자가 앱을 업데이트 할 필요없이 새 이미지를 추가하려는 경우 이미지 디렉토리 (예 : SD 카드)를 유지하는 것이 좋습니다. 이렇게하면 DB에 이미지 파일의 경로 만 저장하면됩니다.

+0

흠 ... 나는 정기적으로 새로운 이미지 "팩"을 제공 할 예정이므로, 업데이트의 형태 여야한다고 생각합니다. 어쨌든 앱이 업데이트되는 방식이 아닌가요? 새 버전이 방금 다운로드 되었습니까? 그렇지 않다면 저에게 알려주세요 ... 그건 안드로이드의 또 다른 영역입니다. 아, 또한 getIdentifier 함수를 사용해 보았지만 잘 작동하지만 그 방법으로 리소스에 액세스하는 것은 비효율적이라고 들었습니다. 그래도 내 유일한 옵션이라고 생각해. 귀하의 답변 주셔서 감사합니다! – Haley

+0

@ 헤일리 : 앱을 업데이트하지 않고 새로운 이미지를 사용할 수 있다는 것은 웹 사이트에서 이미지 다운로드를 제공하는 것과 같습니다. 예를 들어 앱에서 주기적으로 웹 사이트를 확인하고 사용자가 선택할 수있는 새 이미지를 알릴 수 있습니다. 다운로드. 이 경우 res/drawable에있는 것과 같은 '내부'이미지와 달리 앱에 '외부'가됩니다. 만약 당신이 그들 모두를 '내부적'으로 생각한다면, Peter Knego의 대답은 getIdentifier (코드 관점에서)를 사용하는 것보다 낫습니다. 더 효율적이라고는 생각하지 않습니다. :-) – Squonk

+0

안녕하세요, 감사합니다! 내 응용 프로그램은 자원 집약적이지 않으므로이 단계에서는 효율성에 대해 너무 걱정할 필요가 없을 것입니다. 아마도 이미지를 원시 디렉토리로 옮기고 데이터 스트림으로 작업 할 것입니다 ... 행운을 빌어 요! – Haley

관련 문제