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.

User42590
  • 2,473
  • 12
  • 44
  • 85
  • http://stackoverflow.com/questions/9109438/how-to-use-an-existing-database-with-an-android-application/9109728#9109728 – Yaqub Ahmad Jan 22 '13 at 13:47

3 Answers3

5

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

323go
  • 14,143
  • 6
  • 33
  • 41
  • 2
    ok. can you please give any code sol or link from which i can undertsand more – User42590 Jan 17 '13 at 06:21
  • http://stackoverflow.com/questions/4447477/android-how-to-copy-files-in-assets-to-sdcard 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. – 323go Jan 17 '13 at 13:53
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.

GrIsHu
  • 29,068
  • 10
  • 64
  • 102
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;
}
GOLDEE
  • 2,318
  • 3
  • 25
  • 49
  • thankyou . but acually i want to get this .db file and put it in to my assets folder. i want to attach the .db file with my .apk – User42590 Jan 17 '13 at 06:28
  • 1
    so for that you have to manually copy the .db file to your asset folder – GOLDEE Jan 17 '13 at 06:32
  • yah buit i have to access this file and i don;t know how. Please answer my this question if possible http://stackoverflow.com/questions/14373380/how-to-attach-db-file-with-another-apk-android – User42590 Jan 17 '13 at 06:35
  • 1
    there are two ways to use .db or .sqlite file .either – GOLDEE Jan 17 '13 at 06:39
  • 1
    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 – GOLDEE Jan 17 '13 at 06:46
  • 1
    and if you are using the first way then there is no need to copy the file that will be automatically copied – GOLDEE Jan 17 '13 at 06:48
  • 1
    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 ?? – User42590 Jan 17 '13 at 06:52
  • 1
    ok first you select the file in ddms then select the option "pull the file from device" on right corner of fileexplorer of ddms then select the location of file to be saved.then ok – GOLDEE Jan 17 '13 at 06:55
  • 1
    and for opening this .db or .sqlite file use a tool sqlite manager or sqlite browser available free download – GOLDEE Jan 17 '13 at 06:56
  • let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/22878/discussion-between-akhter-and-gauravkumawat) – User42590 Jan 17 '13 at 07:01
  • yah its opening but now from which folder i can access this .db file?? – User42590 Jan 17 '13 at 07:27
  • 1
    from data/data/yourproject/databases/ – GOLDEE Jan 17 '13 at 07:28
  • 1
    then select your file (.db or .sqlite) then select pull option on right corner ,select location to save ,and open that file in sqlite browser (avilable free on net) – GOLDEE Jan 17 '13 at 07:30
  • there is fourth folder in queue but this data folder is not opening – User42590 Jan 17 '13 at 07:35
  • thankyou so much your's suggestion help me alot... once agian thanks.. :) – User42590 Jan 17 '13 at 12:34