SQLite прочитать базу после очистки кэша

185
22 мая 2019, 01:50

У меня есть 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();
}
READ ALSO
Как разбить массив случайным образом на m элементов ?

Как разбить массив случайным образом на m элементов ?

Подскажите пожалуйста как решить данную задачу оптимальным способом :

159
Как загрузить файл в arraylist

Как загрузить файл в arraylist

Мне нужно загрузить файл в arraylist и заменить определенные строки, после записать мой лист в другой файл, как это реализовать?

132
static и переопределение?

static и переопределение?

Все началось с того, что я прочитал про static и про то, что методы помеченные static не переопределяютсяНаписал вот такой код, да бы убедиться:

151
транзакция с OneToMany

транзакция с OneToMany

Я новичек, учу Hibernate и вот столкнулся с проблемойПри первом добавлении в БД, создает три таблицы из которых одна отображает связи - казалось...

141