Possible Duplicate:
How to backup database file to sdcard on android?
I'm working on phonegap 1.3.0. I've created database named test.db in phonegap which is stored in data/data/(pakage name)/test.db. I'm using native android code to copy the database to sdcard (mnt/sdcard). But it is giving error that test.db is not present. The device is not rooted. What I'm missing?
Thanks in advance.
Code is as follows->
public void copyfile(String srFile, String dtFile) throws FileNotFoundException{
String DBPATH = "/data/data/package_name/databases/";
String DBNAME = "test.db";
String myPath = DBPATH + DBNAME;
//Open your local db as the input stream
File externalStorage = Environment.getExternalStorageDirectory();
InputStream myInput = new FileInputStream(myPath);
// Path to the just created empty db
String outFileName = "/mnt/sdcard/folder/test.db";
//Open the empty db as the output stream
OutputStream myOutput;
try {
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();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
The phonegap code is as follows:
<!DOCTYPE html>
<script type="text/javascript" charset="utf-8" src="phonegap-1.3.0.js"></script>
<script type="text/javascript" charset="utf-8">
db = window.openDatabase("test", "1.0", "PhoneGap Demo", 200000);
function createDB() {
db.transaction(populateDB);
}
function populateDB(tx) {
Field17=document.form.Field17.value;
Field18=document.form.Field18.value;
Field19=document.form.Field19.value;
//tx.executeSql('DROP TABLE IF EXISTS INFO');
tx.executeSql('CREATE TABLE IF NOT EXISTS INFO (pid integer primary key, field17,field18,field19');
sql = "INSERT INTO INFO (field17,field18,field19) VALUES ( '" + Field17 + "','" + Field18 + "','" + Field19 + "')";
tx.executeSql(sql);
db.transaction(queryDB);
}
function queryDB(tx,results) {
console.log("inside querydb");
tx.executeSql('SELECT * FROM INFO', [], querySuccess);
}
function querySuccess(tx, results) {
var len = results.rows.length;
alert('rows inserted: ' + len);
if (len > 0) {
for (var i=0;i<len;i++) {
console.log('pid: ' + results.rows.item(i).pid + 'field: ' + results.rows.item(i).field17 + ' field: ' + results.rows.item(i).field18+ ' field ' + results.rows.item(i).field19);
}
}
}
</script>
you no need to root your phone. Check permission
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
.
you can check file
File dbFile = new File(DB_PATH + DB_NAME);
if(dbFile.exists()){
//Continue
Edit: test this code. Change your pakage name and yourFoler in sdcard
public boolean checkDataBase() {
File dbFile = new File(DB_PATH + DB_NAME);
return dbFile.exists();
}
public void copyfile(String srFile, String dtFile) throws FileNotFoundException{
private static String DB_NAME = "dictionary.db";
private static String DB_PATH = "/data/data/com.app.android.dictionary/databases/";
if(checkDataBase()){
InputStream myInput = new FileInputStream(DB_PATH + DB_NAME);
// Path to the just created empty db
String outFileName = Environment.getExternalStorageDirectory().getAbsolutePath() + "/foler/" + DB_NAME;
//Open the empty db as the output stream
OutputStream myOutput;
try {
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();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Application doesn't create the database, actually it is created by Android system and the file permission of the database is -rw-rw----. It means only the User and the group can access it and in this case both are system. So your program doesn't have right to access, hence you got the "Permission Denied" error.