LuckyLuke
LuckyLuke

Reputation: 49087

Moving database on Android

I am shipping my Android application with an SQLite database (300 KB), and after what I read I need to move it in order to use it. In iOS you move the database from the app to the documents folder because you can't write to the app because it is signed. Is this the reason on Android as well? So back to my question. The following code does not copy the database correctly, it only copies some of it. Why so? Have I done something wrong here.

private final static String DB_NAME = "klb.sqlite";
dbPath = "/data/data/" + context.getPackageName() + "/databases/"; // setting this in constructor

(The lines above is private members, applies to both code examples below)

BufferedInputStream bis = new BufferedInputStream(context.getAssets().open(DB_NAME));
FileOutputStream fos = new FileOutputStream(dbPath + DB_NAME);

while (bis.read() != -1) {
    fos.write(bis.read());
}

bis.close();
fos.flush();
fos.close();

However this works: (Sorry for being lazy about re-indenting)

        InputStream inputStream = context.getAssets().open("klb.sqlite");
        OutputStream outputStream = new FileOutputStream(file);

        byte[] buffer = new byte[1024];
        int length;
        while ((length = inputStream.read(buffer)) > 0) {
            outputStream.write(buffer, 0, length);
        }

        inputStream.close();
        outputStream.close();

Upvotes: 1

Views: 602

Answers (1)

Mat
Mat

Reputation: 206727

while (bis.read() != -1) {
    fos.write(bis.read());
}

Look at that closely. Your calling read twice, but write once. You're effectively skipping every other byte.

Upvotes: 5

Related Questions