нет такой таблицы: кавычки (код 1 SQLITE_ERROR): Android P - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть одно приложение котировок, в котором я использую базу данных SqlLite для хранения котировок.Когда пользователь открывает приложение, его копируют данные из активов в базу данных.Работает нормально во всех версиях, но в Android P вылетает при запуске приложения.

выдает ошибку типа

android.database.sqlite.SQLiteException: no such table: quotes (code 1 SQLITE_ERROR): , while compiling: SELECT COUNT(qu_text) AS count FROM quotes

Я уверен, что база данных не копируется, поэтому нет таблицыошибка, но только для Android P. Другая версия работает нормально.

Мой DBHandler.java похож на ниже

public class DBHandler extends SQLiteOpenHelper {
    private static String DB_PATH;
    private static String DB_NAME = "xxx";
    private SQLiteDatabase myDataBase;
    private final Context myContext;

    DBHandler(Context context) {

        super(context, DB_NAME, null, constant.DATABASE_VERSION);
        this.myContext = context;
        DB_PATH = context.getDatabasePath(DB_NAME).toString();
    }
    void createDataBase() throws IOException {

        boolean dbExist = checkDataBase();

        if (dbExist) {
            Log.e("database","exist");
        } else {

            this.getReadableDatabase();

            try {
                copyDataBase();

            } catch (IOException e) {

                throw new Error("Error copying database");

            }
        }

    }

    private boolean checkDataBase() {

        SQLiteDatabase checkDB = null;

        try {
            String myPath = DB_PATH;
            checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

        } catch (SQLiteException e) {

            // database does't exist yet.

        }

        if (checkDB != null) {

            checkDB.close();

        }

        return checkDB != null;
    }


    private void copyDataBase() throws IOException {

        InputStream myInput = myContext.getAssets().open(DB_NAME);

        String outFileName = DB_PATH;

        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();

    }

    // ==============================================================================

    void openDataBase() throws SQLException {

        String myPath = DB_PATH;
        myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

    }


    // ==============================================================================

    @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) {

    }

}

, а класс DAO.java имеет функции, подобные ниже

private void open() throws SQLException {
    if(database!=null&&database.isOpen())return;
    database = dbHandler.getWritableDatabase();

}


private void closeDAO(){
    synchronized (lockObj){
        if(dbHandler!=null)dbHandler.close();
        dbHandler=null;
        database=null;
    }
}



public static void dispose(){

    if(dBObject!=null){
        dBObject.closeDAO();
    }
    dBObject=null;
}

Я пытался закрыть соединение с базой данных, как показано ниже, перед тем, как скопировать базу данных, как один из пользователей сказал в ответ, но все еще появляются ошибки.

private void copyDataBase() throws IOException {
        SQLiteDatabase db = getReadableDatabase();
        db.close();

        InputStream myInput = myContext.getAssets().open(DB_NAME);

        String outFileName = DB_PATH;

        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();

    }

Дайте мне знать, если кто-то может помочь решитьголоволомка.Спасибо

1 Ответ

0 голосов
/ 29 сентября 2018

Предполагаемое поведение в Android P. Вы можете прочитать подробности здесь https://issuetracker.google.com/issues/80268903

Чтобы решить эту проблему, приложение должно убедиться, что нет открытых соединений с базой данных перед копированием файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...