Я считаю, что причина исключения File Not Found заключается в том, что вы используете: -
myInput = context.getAssets().open(DB_LOCATION + DB_NAME);
При попытке найти файл с именем /data/user/0/amalaugustine.example.com.dusyllabus/files/databases/dusyllabus
в активахпапка.
Вероятно, вы должны искать только файл базы данных, поэтому
myInput = context.getAssets().open(DB_NAME);
Это предполагает, что файл с именем dusyllabus не находится в подкаталогепапка активов, но находится непосредственно в папке ресурсов.
Однако у вас может возникнуть проблема с
myOutput = new FileOutputStream(DB_LOCATION + DB_NAME);
Потому что, если файл не существует, 2-й файлисключение не найдено.
Кроме того, вместо /data/user/0/amalaugustine.example.com.dusyllabus/files/databases/dusyllabus
вы используете неверный путь * Путь должен быть /data/user/0/amalaugustine.example.com.dusyllabus/databases/dusyllabus
Кроме того, код, который вы пытаетесь использовать, приведет к копированию базы данных из файла ресурсов каждый раз, когда вы создаете экземпляр класса SyllabusHelper.Поскольку нет проверки, чтобы убедиться, что база данных существует в настоящее время.
Предлагаемое полное исправление: -
Я бы предложил следующий код для SyllabusHelper.java: -
public class SyllabusHelper extends SQLiteOpenHelper {
private static Context mContext;
public static final String DB_NAME = "dusyllabus";
//public static String DB_LOCATION = "/data/data/com.example.amalaugustine.dusyllabus/databases/"; //<<<<<<<<<< not needed
public String db_location; //<<<<<<<<<< ADDED
private static int DB_VERSION = 1;
private SQLiteDatabase mDB;
public SyllabusHelper(Context context) {
super(context, DB_NAME, null, 1);
//ContextWrapper cw = new ContextWrapper(context); //<<<<<<<<<< NOT NEEDED
//DB_LOCATION = cw.getFilesDir().getAbsolutePath() + "/databases/"; //<<<<<<<<<<WRONG
db_location = context.getDatabasePath(DB_NAME).getPath(); //<<<<<<<<<< recommended way to get the path
//Log.v("DBLOCATIONA", DB_LOCATION); //<<<<<<<<<< not used
Log.v("DBLOCATIONB",db_location); //<<<<<<<<<< changed
this.mContext = context;
copyDatabase(mContext);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
Log.v("ONCREATE","On Create has been called");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
public void OpenDatabase() {
String dbPath = mContext.getDatabasePath(DB_NAME).getPath();
Log.v("dbpatH", dbPath.toString());
if (mDB != null && mDB.isOpen()) {
return;
}
mDB = this.getWritableDatabase();
}
private boolean copyDatabase(Context context) {
if (doesDBExist()) return true; //<<<<<<<<<< Check if database already exists
Log.i("Database",
"New database is being copied to device!");
byte[] buffer = new byte[1024];
OutputStream myOutput = null;
int length;
// Open your local db as the input stream
InputStream myInput = null;
try {
myInput = context.getAssets().open(DB_NAME); //<<<<<<<<<< only get according to the file name not the path
// transfer bytes from the inputfile to the
// outputfile
File newdb = new File(db_location); //<<<<<<<<<< get the file so that it exists
myOutput = new FileOutputStream(newdb); //<<<<<<<<<< uses the file
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
myOutput.close();
myOutput.flush();
myInput.close();
Log.i("Database",
"New database has been copied to device!");
return true;
} catch (Exception e) {
e.printStackTrace();
Log.v("QuizActivity", e.toString());
return false;
}
}
//<<<<<<<<<<< ADDED to check for existence of db file
//!!NOTE!! does not check that the file is a valid database
private boolean doesDBExist() {
File db = new File(db_location);
if (db.exists()) {
return true;
}
File dbdir = new File(db.getParent());
dbdir.mkdirs();
return false;
}
}
Конечно, вы всегда можете использовать SQLiteAssetHelper