sorry for such a lame problem, but I can't solve it for 4 hours. I'm trying to copy database from /assets folder that i could use with SQLiteOpenHelper, but when i try to open InputStream it gives me error:
E/Trace: error opening trace file: No such file or directory (2)
code:
public static final String DATABASE_PATH = "/data/data/com.mycomp.myapp/databases/";
public static final String DATABASE_NAME = "database.db";
@Override
protected void onCreate(Bundle savedInstanceState) {
try {
copyDatabase(getApplicationContext());
} catch (IOException e) {
e.printStackTrace();
Log.d(TAG, "blad" + e.toString());
}
}
private void copyDatabase(Context context) throws IOException {
String outfilename = DATABASE_PATH + DATABASE_NAME;
InputStream myinput = context.getAssets().open("database.db");
OutputStream myoutput = new FileOutputStream(outfilename);
byte[] buffer = new byte[1024];
int length;
while ((length = myinput.read(buffer)) > 0) {
myoutput.write(buffer, 0, length);
}
myoutput.flush();
myoutput.close();
myinput.close();
}
can you try this code and then please tell me result.
be sure you check all file names.
@Override
protected void onCreate(Bundle savedInstanceState) {
//.......
DatabaseHelper dbHelper = new DatabaseHelper(this);
dbHelper.createDatabase();
dbHelper.openDatabase();
// do stuff
Cursor data =dbHelper.Sample_use_of_helper();
dbHelper.close();
}
class DatabaseHelper extends SQLiteOpenHelper {
private static String DB_PATH = "/data/data/com.mycomp.myapp/databases/";
private static String DB_NAME = "database.db";
private SQLiteDatabase myDataBase;
private final Context myContext;
public DatabaseHelper (Context context) {
super(context, DB_NAME, null, 1);
this.myContext = context;
}
public void crateDatabase() throws IOException {
boolean vtVarMi = isDatabaseExist();
if (!vtVarMi) {
this.getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}
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();
}
private boolean isDatabaseExist() {
SQLiteDatabase kontrol = null;
try {
String myPath = DB_PATH + DB_NAME;
kontrol = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
} catch (SQLiteException e) {
kontrol = null;
}
if (kontrol != null) {
kontrol.close();
}
return kontrol != null ? true : false;
}
public void openDataBase() throws SQLException {
// Open the database
String myPath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
}
public Cursor Sample_use_of_helper() {
return myDataBase.query("TABLE_NAME", null, null, null, null, null, null);
}
@Override
public synchronized void close() {
if (myDataBase != null)
myDataBase.close();
super.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
remove .db extension from both DB_NAME and .open("database.db")
It looks ugly but currently same thing is working for me....
And before installing new apk please do Clear Data for earlier installed apk
And still if it won't work, please mention your database size.