How to use preloaded SQLite database in Android from assets

I want to use the preloaded database in my application to try to get the database at the time of apk installation, in order to use the data already stored in it. I copy the "components.db" file in the resource folder. And use the following code but this will lead to the error "Problem copying database from resource file"

How can I solve this problem? please suggest me possible ways

My database helper class is like

 class IngredientHelper extends SQLiteOpenHelper { private static final String DATABASE_PATH = "/data/data/com.example.preloadeddatabase/databases/"; private static final String DATABASE_NAME = "ingredients.db"; private static final String TABLE_NAME = "Ingredients"; private static final String COLUMN_ID = "_id"; private static final String COLUMN_TITLE = "ingredient_name"; private static final int SCHEMA_VERSION = 1; public SQLiteDatabase dbSqlite; private final Context myContext; public IngredientHelper(Context context) { super(context, DATABASE_NAME, null, SCHEMA_VERSION); this.myContext = context; } @Override public void onCreate(SQLiteDatabase db) { } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } public void createDatabase() { createDB(); } public void createDB() { boolean dbExist = DbExists(); if (!dbExist) { this.getReadableDatabase(); copyDataBase(); } } private boolean DbExists() { SQLiteDatabase db = null; try { String databasePath = DATABASE_PATH + DATABASE_NAME; db = SQLiteDatabase.openDatabase(databasePath, null, SQLiteDatabase.OPEN_READWRITE); db.setLocale(Locale.getDefault()); db.setLockingEnabled(true); db.setVersion(1); } catch (SQLiteException e) { Log.e("SqlHelper", "Database Not Found"); } if (db != null) { db.close(); } return db != null ? true : false; } private void copyDataBase() { InputStream iStream = null; OutputStream oStream = null; String outFilePath = DATABASE_PATH + DATABASE_NAME; try { iStream = myContext.getAssets().open(DATABASE_NAME); oStream = new FileOutputStream(outFilePath); byte[] buffer = new byte[2048]; int length; while ((length = iStream.read(buffer)) > 0) { oStream.write(buffer, 0, length); } oStream.flush(); oStream.close(); iStream.close(); } catch (IOException e) { throw new Error("Problem Copying Database From Resource File"); } } public void openDatabase() throws SQLException { String myPath = DATABASE_PATH + DATABASE_NAME; dbSqlite = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); } @Override public synchronized void close() { if (dbSqlite != null) { dbSqlite.close(); } super.close(); } public Cursor getCursor() { SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); queryBuilder.setTables(TABLE_NAME); String[] asColumnsToReturn = new String[] { COLUMN_ID, COLUMN_TITLE }; Cursor mCursor = queryBuilder.query(dbSqlite, asColumnsToReturn, null, null, null, null, "ingredient_name ASC"); return mCursor; } public String getName(Cursor c) { return (c.getString(1)); } 
+6
source share
3 answers

Do not open a readable database until you copy the resource file to the database directory. You are probably getting an exception because you are trying to write a file that you already have open (since it opens when you call getReadableDatabase ()).

+2
source

The following is a simple solution , but there is an error in this method. When you use the this.getReadableDatabase (); method, then the database is open, i.e. It should be closed this.close (); This error is especially important for HTC Desire devices.

Use this solution , there we allow the opening of the database.

+1
source

the database file must have the extension ".sqlite" instead of ".db"

0
source

Source: https://habr.com/ru/post/902443/


All Articles