Link to home
Start Free TrialLog in
Avatar of rmartes
rmartes

asked on

Android Sqlite copy esixting database into app

Hello Experts,

I'm trying to copy my existing sqlite db from my assets folder to the apk database directory using a SQLiteOpenHelper:

private Context mycontext; 
	 
	private String DB_PATH = "/data/data/com.test/databases/"; 
	//private String DB_PATH = mycontext.getApplicationContext().getPackageName()+"/databases/"; 
	private static String DB_NAME = "test.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(outfilename); 
	 
	    // 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(); 
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
		
	} 

Open in new window


It works fine (no errors) on emulator running 2.1, but I get a dbopen: no such file or directory error as if the dbfile is not being copied on the real device running 2.3. My db is only 3kb is size for testing purposes. I have tried several posts, but i get the same error.

Please help, I'm out of options.

Thanks

UPDATE:
This code actually works. However, it crashes on first run/installation. On second run, it seems to create the db and select record. Any ideas on why would it crash on fist run?
Avatar of rmartes
rmartes

ASKER

in addition, i am able to create and select a record using 2.1. Can it be a permission error invovling the copy from assets folder in 2.3?
Avatar of rmartes

ASKER

Please see question update in bold. The code works, but not on first run on 2.3. May this be an onCreate issue?
Avatar of rmartes

ASKER

Anybody?
ASKER CERTIFIED SOLUTION
Avatar of rmartes
rmartes

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of rmartes

ASKER

Solved it on my own.