Problema de Resources.openRawResource ()

Tengo un archivo de base de datos en la carpeta res/raw/ . R.raw.FileName Resources.openRawResource() con el nombre de archivo como R.raw.FileName y obtengo una secuencia de entrada, pero tengo otro archivo de base de datos en el dispositivo, para copiar el contenido de ese db al db del dispositivo que uso:

  BufferedInputStream bi = new BufferedInputStream(is); 

y FileOutputStream, pero recibo una excepción de que el archivo de la base de datos está dañado. ¿Cómo puedo proceder? Intento leer el archivo usando File y FileInputStream y la ruta como /res/raw/fileName , pero eso tampoco funciona.

Sí, debería poder usar openRawResource para copiar un binario desde su carpeta de recursos sin openRawResource al dispositivo.

En función del código de ejemplo de las demostraciones de la API (contenido / ReadAsset), debe poder usar una variación del siguiente fragmento de código para leer los datos del archivo db.

 InputStream ins = getResources().openRawResource(R.raw.my_db_file); ByteArrayOutputStream outputStream=new ByteArrayOutputStream(); int size = 0; // Read the entire resource into a local byte buffer. byte[] buffer = new byte[1024]; while((size=ins.read(buffer,0,1024))>=0){ outputStream.write(buffer,0,size); } ins.close(); buffer=outputStream.toByteArray(); 

Ahora debe existir una copia de su archivo en el buffer , por lo que puede usar un FileOutputStream para guardar el búfer en un nuevo archivo.

 FileOutputStream fos = new FileOutputStream("mycopy.db"); fos.write(buffer); fos.close(); 

InputStream.available tiene limitaciones severas y nunca debe usarse para determinar la duración del contenido disponible para la transmisión.

http://developer.android.com/reference/java/io/FileInputStream.html#available (): “[…] Devuelve una cantidad estimada de bytes que se pueden leer u omitir sin bloquear para obtener más información. [. ..] Tenga en cuenta que este método proporciona una garantía tan débil que no es muy útil en la práctica “.

Tienes 3 soluciones:

  1. Repase el contenido dos veces, primero para calcular la longitud del contenido, segundo para leer los datos
  2. Dado que los recursos de Android están preparados por usted, el desarrollador, hardcode su longitud esperada
  3. Coloque el archivo en el directorio / asset y léalo a través de AssetManager, que le da acceso a AssetFileDescriptor y sus métodos de longitud de contenido. Sin embargo, esto puede darle el valor DESCONOCIDO de la longitud, que no es tan útil.