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?

1
  • Why someone votes this question down? That does not make sense. Commented Oct 26, 2015 at 10:16

3 Answers 3

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.

Sign up to request clarification or add additional context in comments.

Comments

1

AFAIK, this it is not possible.

Comments

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();
    }
}

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.