2

how to save .db or .sqlite in assets folder . At this time i am doing that:

    @Override
    public void onCreate(SQLiteDatabase db) {
        mDatabase = db;

          SQLiteDatabase.openOrCreateDatabase("assets/"+DATABASE_NAME+".db", null);

        mDatabase.execSQL(FTS_TABLE_CREATE);


    }

but the openOrCreateDatabase giving error. I try with both .db and .sqlite but error is same.

1

3 Answers 3

5

You can't open the database from assets -- you'll need to copy it to local storage first.

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

2 Comments

ok. can you please give any code sol or link from which i can undertsand more
stackoverflow.com/questions/4447477/… gives an example, if you look at the accepted answer. You'll mainly need the copyFile() method, as you already know the name of the file you're copying. You can also copy to secure storage instead of sdcard: Just leave out the '/sdcard/' + when creating the output stream.
2

Here ,I am giving you the complete code,plz reply if you success

public class DataBaseHelper extends SQLiteOpenHelper{
private Context mycontext;

private String DB_PATH = "/data/data/gr.peos/databases/";
//private String DB_PATH = mycontext.getApplicationContext().getPackageName()+"/databases/";
private static String DB_NAME = "BLib.sqlite";//the extension may be .sqlite or .db
public SQLiteDatabase myDataBase;
/*private String DB_PATH = "/data/data/"
                            + mycontext.getApplicationContext().getPackageName()
                            + "/databases/";*/

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() {
    //SQLiteDatabase checkdb = null;
    boolean checkdb = false;
    try{
        String myPath = DB_PATH + DB_NAME;
        File dbfile = new File(myPath);
        //checkdb = SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN_READWRITE);
        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/gr.peos/databases/BLib.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();
}

Thanks.

Comments

1

You have to first check th database in databases folder(there is nothing )

then you have to copy the .db or .sqlite to data/data/databases folder and than only u can open data base

here is my sample code to do that:

public void createDataBase() throws IOException {
     boolean dbExist = checkDataBase();
     //boolean dbExist = false;
    if (dbExist) {
        // do nothing - database already exist
    } else {

        this.getReadableDatabase();
        try {
            copyDataBase();
        } catch (IOException e) {
            throw new Error("Error copying database");
        }
    }

}

// this method will check the existance of database
private boolean checkDataBase() {
    SQLiteDatabase checkDB = null;

    String myPath = DB_PATH + DB_NAME;
    try {
        checkDB = SQLiteDatabase.openDatabase(myPath, null,
                SQLiteDatabase.OPEN_READONLY);
    } catch (Exception e) {

    }

    if (checkDB != null) {
        checkDB.close();
    }

    return checkDB != null ? true : false;
}

// copy the database file from asset folder to the DDMS database folder
private void copyDataBase() throws IOException {
    // Open your local db as the input stream
    InputStream myInput = _context.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(outFileName);

    // transfer bytes from the inputfile to the 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();
}

// open the database
public boolean openDataBase() throws SQLException {
    String mPath = DB_PATH + DB_NAME;
    // Log.v("mPath", mPath);
    db = SQLiteDatabase.openDatabase(mPath, null,
            SQLiteDatabase.CREATE_IF_NECESSARY);
    return db != null;
}

15 Comments

so for that you have to manually copy the .db file to your asset folder
there are two ways to use .db or .sqlite file .either
there are two ways to use .db or .sqlite file . 1.either u have to create new database using SQLIteopenhelper class which will craete your .db file or .sqlite file to data/data/databases folder in ddms .or 2. you have the previously craeted database ,using any tool so you have that .db file or .sqlite file Now if you are using the second way then only you have to copy the file from your sqlite tool that you have used to craete your database to aaset and then use above code to copy that to ddms
and if you are using the first way then there is no need to copy the file that will be automatically copied
yes i have to copied the previously created database in my app. but how can i get the .db file means the .db file by default save in data/data/pakagename/dbname but how can manually i access it ??
|

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.