Stephanie
Stephanie

Reputation: 129

SQLiteException when copying/decompressing a zipped DB onto Android

Currently, I am copying a database from my assets folder to the to the /data/data/package folder. This is that code (from the answer here), which works:

public void copyDataBase() throws IOException{
    // open db as input stream
    InputStream myInput;
    //open empty db as output stream
    OutputStream myOutPut;
    try {
        myInput = myContext.getAssets().open(DB_NAME);

        //path to newly created db
        String outFileName =DB_PATH + DB_NAME;

        myOutPut = new FileOutputStream(outFileName);

        //transfer bytes from the inputFile to the outPutFile
        byte[] buffer = new byte[1024];
        int length;
        while((length = myInput.read(buffer))>0){
            myOutPut.write(buffer, 0, length);
        }
        myOutPut.flush();
        myOutPut.close();
        myInput.close();
        }
    catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Now in order to save space in the .apk download, I am trying to zip the file before copying it to the /data/data/package folder.

private void copyDataBaseFromZipFile() {
    InputStream inputStream = null;
    OutputStream outputStream = null;

    String sourcePathname = this.getBundledPathname();
    String destinationPath = this.getDatabasePathname();

    try {
        inputStream = this.mContext.getAssets().open(sourcePathname);
        ZipInputStream zipStream = new ZipInputStream(inputStream);

        int BUFFER = 8096;
        outputStream = new FileOutputStream(destinationPath);
        BufferedOutputStream dest = new BufferedOutputStream(outputStream, BUFFER);

        ZipEntry entry;
        while ((entry = zipStream.getNextEntry()) != null) {
            if (entry.getName().equals("androidDB.sql")) }
                int count;
                byte data[] = new byte[BUFFER];
                while ((count = zipStream.read(data, 0, BUFFER)) != -1) {
                    dest.write(data, 0, count);
                }
            }
        }

        outputStream.flush();
        outputStream.close();

        dest.flush();
        dest.close();

        zipStream.close();

        inputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

When I attempt to open the database later (with SQLiteDatabse), I get this error: android.database.sqlite.SQLiteException: unable to open database file

I haven't changed anything except the file I'm copy from, which is only a zipped version of the one I was previously copying over. The final database is the right size, so it doesn't seem to be still compressed... If anyone has any suggestions or possible reasons WHY it won't open, it would be greatly appreciated.

Upvotes: 1

Views: 706

Answers (1)

Brigham
Brigham

Reputation: 14564

You should remove these lines:

outputStream.flush();
outputStream.close();

Your BufferedOutputStream probably has some buffered bytes, but since you close outputStream before you call dest.flush(), those bytes are never actually written to the file.

Upvotes: 2

Related Questions