1

Hi I am trying to use preloaded database in my app. but when I am run the app it will give the error

sqlite3_open_v2("/data/data/com.example.preloaddatabase/databases/ingredients.db", &handle, 2, NULL) failed

ERROR IN CODE :android.database.sqlite.SQLiteException: unable to open database file

And My Database Helper Class is:

class IngredientHelper extends SQLiteOpenHelper {
    private static final String DATABASE_PATH = "/data/data/com.example.preloaddatabase/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) {
        db.execSQL("Create Table Ingredients(_id INTEGER PRIMARY KEY,ingredient_name TEXT)");
    }

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

1 Answer 1

3

Step #1: Get rid of the following lines:

public SQLiteDatabase dbSqlite;
private final Context myContext;

Step #2: Change getCursor() to call getReadableDatabase() instead of referencing the now-removed dbSqlite.

Step #3: Delete all other methods that refer to dbSqlite or myContext.

Step #4: Delete DATABASE_PATH (do not hardcode paths).

Step #5: Delete the createDB(), createDatabase(), DbExists(), and copyDataBase() methods. If you wish to try to ship a database with your app, consider using SQLiteAssetHelper.

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.