SQLite: нет такой таблицы ошибок Android P проблема - PullRequest
0 голосов
/ 08 октября 2018

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

У меня есть файлы базы данных .db sqlite, хранящиеся в папке assets.Я импортировал их в пространство базы данных Android, и он работал нормально до Android P. В Android P я получаю это исключение: SQLite: No Such Table Error

Я искал здесь и нашел это, и я попытался применитьпринятый ответ: Android P - «SQLite: Ошибка такой таблицы» после копирования базы данных из ресурсов

Проблема в том, что теперь у меня возникла другая проблема, и она все еще не работает.Теперь у меня проблема в том, что каждый раз, когда я пытаюсь проверить, существует ли база данных, этот код всегда возвращает true, поэтому я никогда не создаю базу данных .Даже если база данных еще не создана, даже с недавно установленным приложением:

private boolean checkIfDBExists() {
    File dbFile = new File(DB_COMPLETE_PATH);
    return dbFile.exists();
}

Мой исходный код - это исходный код принятого ответа в ранее цитируемом вопросе stackoverflow.

Новый AndroidP требуемый способ получения пути к БД:

public static String getDatabasePath(String fileNname){
    MySQLiteOpenHelper helper = new MySQLiteOpenHelper(ApplicationContextProvider.getContext(), fileNname);
    SQLiteDatabase database = helper.getReadableDatabase();
    String path = database.getPath();
    database.close();
    return path;
}

public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    public MySQLiteOpenHelper(Context context, String databaseName) {
        super(context, databaseName, null, 2);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

    @Override
    public void onOpen(SQLiteDatabase db) {
        super.onOpen(db);
        db.disableWriteAheadLogging();
    }
}

Мой класс DBHelper:

public class DbHelper extends SQLiteOpenHelper{ 
    private  String DB_NAME;
    private  String DB_COMPLETE_PATH;
    private SQLiteDatabase mDataBase;
    private static final int DATABASE_VERSION = 1;

    public DbHelper(String name) throws IOException {
        super(ApplicationContextProvider.getContext(), name+".db", null, DATABASE_VERSION);
        this.DB_NAME = name+".db";
        this.DB_COMPLETE_PATH = Util.getDatabasePath(DB_NAME);

        boolean mustOverWriteDB; 

        if (checkIfDBExists()==false) {
            createDataBase();
        }

        openDataBase();
    }

    private void createDataBase() throws IOException {
        this.getReadableDatabase();
        try {           
            copyDataBase();            
        } catch (IOException e) {           
            throw new RuntimeException(e);
        }
    }

    public void copyDataBase() throws IOException {
        InputStream myInput = App.getInstance().getAssetsFile(DB_NAME);
        String outFileName = DB_COMPLETE_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();
    }
}

Ответы [ 4 ]

0 голосов
/ 19 апреля 2019

добавьте этот путь в вашу базу данных

String dbPath = "/data/data/" + mContext.getPackageName() + "/cache/" + mDataBaseName;
0 голосов
/ 08 октября 2018

Arg, наконец, решил это, добавив this.close(); после this.getReadableDatabase();

Это открытое соединение генерировало оригинал без такой исключительной ситуации таблицы

Поэтому я использовал Util.getDatabasePath (DB_NAME);вместо комплексного предложенного решения в Android P - «SQLite: Нет такой ошибки таблицы» после копирования базы данных из активов , и теперь код стал намного проще

Большое спасибо @LifeStyle, потому чтоблагодаря ему я обнаружил реальную проблему

Теперь код стал намного проще:

public static String getDatabasePath(String fileNname){
    return ApplicationContextProvider.getContext().getDatabasePath(fileNname).getAbsolutePath();
}

public class DbHelper extends SQLiteOpenHelper{
    private String DB_NAME;
    private String DB_COMPLETE_PATH;
    private SQLiteDatabase mDataBase;
    private static final int DATABASE_VERSION = 1;

    public DbHelper(String name) throws IOException {
        super(ApplicationContextProvider.getContext(), name+".db", null, DATABASE_VERSION);
        this.DB_NAME = name+".db";
        this.DB_COMPLETE_PATH = Util.getDatabasePath(DB_NAME);

        if (checkIfDBExists()==false){
            createDataBase();
        }

        openDataBase();
    }

    private void createDataBase() throws IOException {
        this.getReadableDatabase();
        this.close();
        try {           
            copyDataBase();            
        } catch (IOException e) {           
            throw new RuntimeException(e);
        }
    }

    private boolean checkIfDBExists() {
        File dbFile = new File(DB_COMPLETE_PATH);
        return dbFile.exists();
    }
}
0 голосов
/ 11 ноября 2018

Мои проблемы с Android P были решены путем добавления this.close(); после this.getReadableDatabase();

0 голосов
/ 08 октября 2018

В вашем классе DBHelper вы создаете БД перед тестированием, если БД существует в методе Util.getDatabasePath (DB_NAME).Эта строка создает DB

this.DB_COMPLETE_PATH = Util.getDatabasePath(DB_NAME);

. Вызывая этот метод, вы открываете sql open helper и создаете базу данных (в вашем случае пустую, потому что в методе OnCreate () ничего не происходит).

Если вы хранитеваша БД в пути к базе данных приложения по умолчанию, тогда вы можете проверить, существует ли БД по следующему фрагменту:

File f = context.getDatabasePath("my_database.db");
if(f.exists()) {
   //Your code if DB exist
} else {
   //Your code if DB doesn't exist
}

. И лучшим местом для отключения WAL является метод onConfigure () в SQLiteOpenHelper

...