I'm getting NullpointerException while trying to access db in Assets folder. And the db is indicated red in color on Assets folder.
Image containing Db in Assets
public void createdatabase() throws IOException
{
System.out.println(" came into Create database ");
//Open your local db as the input stream
InputStream myinput = mycontext.getAssets().open(DB_NAME);
System.out.println(" myinput = "+myinput.toString());
System.out.println(" Got input ");
// Path to the just created empty db
String outfilename = DB_PATH + DB_NAME;
System.out.println(" outfilename = "+outfilename);
//Open the empty db as the output stream
OutputStream myoutput = new FileOutputStream(outfilename);
// transfer byte to inputfile to outputfile
System.out.println(" created outputStream");
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();
}
Is there any way to check the db values in String?
DB_NAME does not match with the name of the file in assets folder.
Any reason why you did not tell the values?
Related
I need a local database for my application.I created one and i encrypted it.(I know the pw).Now i want to load this db to my original application's assets folder.I want to decrypt it before copy.
I had a copy code like this this is working for unencrpyted db.
How can I translate this for my encrypted db.Thanks
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 bytes from the inputfile to the outputfile
byte[] buffer = new byte[5120];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
//Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
}
The proper way to do this would be to copy the encrypted database into a local folder. Then you can open it with SQLCipher and use sqlcipher_export() to convert it into a standard (non-encrypted) SQLite database.
I have copied database in Android Project folder and It is working fine. Now, I am inserting values in table. So I want to know that Is there anyway by which I can see those data using SqlLite Database Browser ???
Database in assets folder, I opened it but I can't see any new data.
My Code to insert data:, It is working fine, no errors.
public boolean SaveUserResponse(String QId, String OptionId,
String ResponseDate) {
try {
ContentValues cv = new ContentValues();
cv.put("QId", QId);
cv.put("OptionId", OptionId);
cv.put("ResponseDate", ResponseDate);
mDb.insert("tblUserResponse", null, cv);
Log.d("SaveUserResponse", "User Response has been Saved.");
return true;
} catch (Exception ex) {
Log.d("SaveUserResponse", ex.toString());
return false;
}
You can fetch your DB from device using DDMS (can be found under android-sdk\tools). There open Device -> File Explorer. Then navigate to data\data\your_app and pull your DB to a disk.
BTW, your DB shouldn't be placed under assets, here is a code how to copy it from assets (you can call it on the first run of your app):
void copyDataBase() throws IOException {
String DB_PATH = "/data/data/<app>/databases/";
String DB_NAME = "db.sqlite";
//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 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();
}
For the last few days I've been trying to copy two databases in the asset folder, but could not get any success.
One database I managed to copy and access it. But the second one, I need your help.
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/(packagename)/databases /(datbasename).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();
}
Do this for your second database.
Please take a look at the following function :
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;
File f = new File(DB_PATH);
if (!f.exists()) {
f.mkdir();
}
//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;
//myInput.read(buffer);
while ((length = myInput.read(buffer))>0){
myOutput.write(buffer, 0, length);
}
//Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
}
Where DB_PATH is "/data/data/application package/databases/". Is it possible to set DB_PATH="" ? Actually setting DB_PATH = "/data/data/application package/databases/". works fine on most devices, but does not work on HTC desire HD ( discussed here , here , here and here ). This device does not find the mentioned path on the device.
Thanks
You should set your DB_PATH like this:
String DB_PATH = context.getDatabasePath(DB_NAME).getAbsolutePath()
That will give you the full path to your Database.. then you can use that as your outFileName.
Is it possible to supply prefilled SQLite DB to my app? I want to use db as ordinary SQLite db which will have tables filled manually and I want to include it into my .apk file.
Yes, include it in your assets folder and copy it into the /databases folder when your application first launches.
try this
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 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();
}
Including in the assets folder is one option (Apk size will be increased.)
How about storing the pre-filled db on any cloud storage service provider and downloading the file on the first run of the app?