2

I want to ship my android application with an embedded database. Searching on the net I found that people ship it within assets of the app an then copy it to other directory at install time / first run.

In my case I need a Read-Only DB so I don't want to make multiple copies of it. Is it possible to use it directly from assets? Is there a way to save that space?

shadox
  • 3,238
  • 4
  • 24
  • 38

3 Answers3

2

In my case I need a Read-Only DB so I don't want to make multiple copies of it. Is it possible to use it directly from assets? Is there a way to save that space?

No. Assets are not regular files in your device and there is no way for the sqlite library to read them directly.

Either just copy the file using e.g. sqlite-asset-helper or don't use sqlite database but rather something that can work with the InputStreams provided by AssetManager.

laalto
  • 150,114
  • 66
  • 286
  • 303
1

AFAIK, this it is not possible.

Omar Hassan
  • 727
  • 1
  • 11
  • 24
0

I think it's not possible, check this similar question here: Reading sqlite file from asset folder

To use the database you need to copy it to the assets folder to the folder to a directory inside the app.

Check this code.

public class DataBaseHelper extends SQLiteOpenHelper {
    private Context mycontext;
    private static String DB_NAME = "(datbasename).sqlite";
    public SQLiteDatabase myDataBase;


    public DataBaseHelper(Context context) throws IOException {
        super(context,DB_NAME,null,1);
        this.mycontext=context;
        boolean dbexist = checkdatabase();
        if (dbexist) {
            //System.out.println("Database exists");
            opendatabase();
        } else {
            System.out.println("Database doesn't exist");
            createdatabase();
        }
    }

    public void createdatabase() throws IOException {
        boolean dbexist = checkdatabase();
        if(dbexist) {
            System.out.println(" Database exists.");
        } else {
            this.getReadableDatabase();
            try {
                copydatabase();
            } catch(IOException e) {
                throw new Error("Error copying database");
            }
        }
    }

    private boolean checkdatabase() {

        boolean checkdb = false;
        try {
            String myPath = DB_PATH + DB_NAME;
            File dbfile = new File(myPath);

            checkdb = dbfile.exists();
        } catch(SQLiteException e) {
            System.out.println("Database doesn't exist");
        }
        return checkdb;
    }

    private void copydatabase() throws IOException {
        //Open your local db as the input stream
        InputStream myinput = mycontext.getAssets().open(DB_NAME);

        // Path to the just created empty db
        String outfilename = DB_PATH + DB_NAME;

        //Open the empty db as the output stream
        OutputStream myoutput = new FileOutputStream("/data/data/(packagename)/databases   /(datbasename).sqlite");

        // transfer byte to inputfile to outputfile
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myinput.read(buffer))>0) {
            myoutput.write(buffer,0,length);
        }

        //Close the streams
        myoutput.flush();
        myoutput.close();
        myinput.close();
    }

    public void opendatabase() throws SQLException {
        //Open the database
        String mypath = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(mypath, null, SQLiteDatabase.OPEN_READWRITE);
    }

    public synchronized void close() {
        if(myDataBase != null) {
            myDataBase.close();
        }
        super.close();
    }
}
Community
  • 1
  • 1
Bruno Coelho
  • 926
  • 13
  • 25