У меня есть Sqlite база , которую я читаю из файла Assets.
Вот встал вопрос как правильно обойти один момент.
Все хорошо работает, но если зайти в настройки --> приложение --> и очистить кэш и данные, базы итд , то приложение выкидывает SQLiteException
no such table: bus_end (code 1): , while compiling: SELECT * FROM
потому что затирается база.
Через файловый менеджер я вижу что база существует, но она становится просто пустой, что логично. Если подсунуть пинком через менеджер не затертый файл все работает дальше... То есть я понимаю что пользователь может почистить кэш и тогда все упадет. Вопрос . как правильно решается данная проблема?
Вот мой код:
public class DatabaseHelper extends SQLiteOpenHelper {
//The Android's default system path of your application database.
private static String DB_PATH = "";
private static final int DB_VERSION = 1;
private static String DB_NAME = "app_database.db";
private final Context myContext;
private SQLiteDatabase myDataBase;
public DatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
this.myContext = context;
}
/**
*
* Создает пустую базу данных в системе и переписывает ее с помощью собственной базы данных.
*/
public void createDataBase() throws IOException {
boolean dbExist = checkDataBase();
if (!dbExist)
this.getWritableDatabase();//Создает и/или открывает базу данных
if (myDataBase.isOpen()){
myDataBase.close();
}
try {
copyDataBase();
} catch (IOException e) {
throw new Error(e + "Error copying database");
}
}
/**
* Check if the database already exist to avoid re-copying the file each time you open the application.
*
* @return true if it exists, false if it doesn't
*/
private boolean checkDataBase() {
SQLiteDatabase checkDB = null;
String path = DB_PATH + DB_NAME;
try {
checkDB = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
} catch (SQLiteException e) {
//database does't exist yet
}
if (checkDB != null) {
checkDB.close();
}
return checkDB != null;
}
/**
* Copies your database from your local assets-folder to the just created empty database in the
* system folder, from where it can be accessed and handled.
* This is done by transfering bytestream.
*/
private void copyDataBase() throws IOException { //Откройте локальный db в качестве входного потока
InputStream myInput = myContext.getAssets().open(DB_NAME); //Путь к только что созданному пустому db
String outFileName = DB_PATH + DB_NAME; //Откройте пустой бит в качестве выходного потока
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();
}
public void openDataBase() throws SQLException {
String myPath = DB_PATH;
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
}
// ПОЛУЧИТЬ
public Cursor getAllData(String table_name) {
myDataBase = getReadableDatabase();
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) {
}
}
private void retrieve() {
listStationItemList.clear();
try {
db.createDataBase();
db.openDataBase();
} catch (Exception e) {
e.printStackTrace();
}
//RETRIEVE
Cursor cursor = db.getAllData(TABLE_BUS);
//LOOP AND ADD TO ARRAYLIST
while (cursor.moveToNext()) {
long _id = cursor.getLong(0);
String name = cursor.getString(1);
String details = cursor.getString(2);
ItemListStation p = new ItemListStation(name, details);
listStationItemList.add(p);
}
//CHECK IF ARRAYLIST ISNT EMPTY
if (!(listStationItemList.size() < 1)) {
recyclerView.setAdapter(adapter);
}
db.close();
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Подскажите пожалуйста как решить данную задачу оптимальным способом :
Мне нужно загрузить файл в arraylist и заменить определенные строки, после записать мой лист в другой файл, как это реализовать?
Все началось с того, что я прочитал про static и про то, что методы помеченные static не переопределяютсяНаписал вот такой код, да бы убедиться:
Я новичек, учу Hibernate и вот столкнулся с проблемойПри первом добавлении в БД, создает три таблицы из которых одна отображает связи - казалось...