troubleshooting Question

Android Sqlite copy esixting database into app

Avatar of rmartes
rmartes asked on
JavaAndroid
5 Comments1 Solution1113 ViewsLast Modified:
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
		
	} 

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?
ASKER CERTIFIED SOLUTION
rmartes

Our community of experts have been thoroughly vetted for their expertise and industry experience.

Join our community to see this answer!
Unlock 1 Answer and 5 Comments.
Start Free Trial
Learn from the best

Network and collaborate with thousands of CTOs, CISOs, and IT Pros rooting for you and your success.

Andrew Hancock - VMware vExpert
See if this solution works for you by signing up for a 7 day free trial.
Unlock 1 Answer and 5 Comments.
Try for 7 days

”The time we save is the biggest benefit of E-E to our team. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange.

-Mike Kapnisakis, Warner Bros