Ваш код имеет несколько проблем.
Во-первых, я считаю, что он не предназначен для установки приложения в качестве нового приложения, когда каталог database , в который будет загружен файл базы данныхreside не существует, и поэтому копирование не удастся, так как выходной файл не может быть открыт.
Во-вторых, будет предпринята попытка скопировать базу данных при каждом запуске приложения, так как нет проверки, чтобы проверить,база данных действительно существует.
Хотя это и не проблема, если используется метод Context getDatabasePath , нет необходимости жестко кодировать путь, который может быть неправильным.Кроме того, он должен защищать код в будущем.
Я полагаю, что следующий DatabaseHelper решит ваши проблемы (за исключением случаев, когда проблема заключается в том, что файл test был скопирован в assets папка (и является действительной базой данных)): -
DatabaseHelper.java
public class DatabaseHelper extends SQLiteOpenHelper {
private String DB_PATH;
private static String DB_NAME = "test";
private final Context context;
public DatabaseHelper(Context context) {
super(context, DB_NAME, null, 1);
this.context = context;
this.DB_PATH = context.getDatabasePath(DB_NAME).getPath(); //<<<<<<<<<< REPLACES following line
//this.DB_PATH = "/data/data/" + context.getPackageName() + "/" + "databases/";
Log.e("Database Path:", DB_PATH);
if (!checkDatabase()) {
try {
copyDatabase();
} catch (IOException ioe) {
ioe.printStackTrace();
throw new RuntimeException("Error creating Database - see stack-trace above.");
}
}
}
private boolean checkDatabase() {
File dbpath = new File(DB_PATH);
if (dbpath.exists()) {
return true;
} else {
if (!dbpath.getParentFile().exists()) {
dbpath.getParentFile().mkdirs();
}
}
return false;
}
private void copyDatabase() throws IOException { // MADE PRIVATE AS USED INTERNALLY
InputStream myInput = context.getAssets().open(DB_NAME);
String outString = DB_PATH;
OutputStream myOutput = new FileOutputStream(outString);
byte[] buffer = new byte[10];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
- В основном добавление метода checkDatabase , который будетсоздайте папку ** database *, если она не существует, это исправление проблемы, с которой вы столкнулись.
Вызов checkDatabase перед выполнением копирования и только копирование, если база данных не существует, устраняет вторую проблему, с которой вы столкнулись бы после разрешения первой.
- Обратите внимание, что простое создание экземпляра DatabaseHelper при необходимости выполнит копирование файла базы данных из папки assets, поэтому ваш код во фрагменте может быть
: -
public class ViewFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment, container, false);
DatabaseHelper db = new DatabaseHelper(getActivity());
return view;
}
}