Android: копирование заполненной базы данных sqlite из папки ресурсов не работает правильно и вызывает ошибки - PullRequest
0 голосов
/ 25 сентября 2018

***** Я выяснил это ********* извините, что потратил время впустую, но я понял, что я делаю неправильно.Я использовал строку dbcontext.deletedatabase ("tupperware.db"), потому что я думал, что она удалит мою сохраненную базу данных пикселей xl, чтобы можно было скопировать новую из ресурсов.Я до сих пор не до конца понимаю, как это работает, но очевидно, что эта строка мешала копированию базы данных и приводила к копированию пустой базы данных без таблиц.Я попытался скопировать базу данных без этой строки кода, и она скопировалась, и теперь мое приложение снова работает.Спасибо всем за помощь !!!Ниже этой строки находится оригинальный вопрос, который я задал *****************************

Я работаю в Android Studio3.1.4 в приложении, которое использует базу данных sqlite.

Я тестирую приложение на моем телефоне Google Pixel XL под управлением Android версии 9.

Я хотел удалить базу данных, используя код, а затем скопировать другую базу данных (с эквивалентным именем и таблицами ...только меньше данных) из папки активов в Android Studio в пиксель xl, чтобы мое приложение могло получить к нему доступ.Когда я попробовал это, приложение теперь зависало, выдавая следующую ошибку ...

android.database.sqlite.SQLiteException: no such table: container (code 1 
SQLITE_ERROR): , while compiling:

Я написал некоторый код, чтобы проверить, существует ли база данных, и он возвращает "true", указывая, что база данных существует.Кроме того, в Android Studio я открыл View> Tool Windows> Device File Explorer, и я вижу, что база данных находится там, где она должна быть (в data / data / MY PACKAGE INFO / database) вместе с той же базой данных с db-shm ирасширение db-wal.Однако я заметил, что размер базы данных составляет всего 12 КБ, а база данных, которую я поместил в папку ресурсов, - 156 КБ, поэтому я сохранил базу данных 12 КБ на свой компьютер и открыл ее с помощью DB Browser для Sqlite и обнаружил, что база данных пуста.В нем нет таблиц или данных.Поэтому я хочу знать, что я делаю неправильно.Почему база данных копируется неправильно (я имею в виду копирование без таблиц или данных) ????

Вот некоторые вещи, которые я пробовал ...

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

-Я удалил приложение с телефона и переустановил его (много раз).

-Я очистил кэш приложения, а также удалил данные для него (также много раз)).

-Я пробовал различные строки кода, которые вы можете видеть ниже, которые я сейчас закомментировал

-Я сравнил свой код, чтобы скопировать базу данных в другие здесь на stackoverflow и этопочти точно так же.Я не обнаружил никаких явных ошибок.

-Я попытался изменить номер версии базы данных в своем коде

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

-Я попытался скопировать несколько разных баз данных с одинаковыми именами и эквивалентными таблицами (все базы данных sqlite)

Вот мой код, который копирует базу данных ...

public class DatabaseHelper extends SQLiteOpenHelper {

    private static String DB_NAME = "tupperware.db";
    private static String DB_PATH = Environment.getDataDirectory().getAbsolutePath() + "/data/com.bignerdranch.android.tupperwarelayout/databases/";
    //private static String DB_PATH = "/data/data/com.bignerdranch.android.tupperwarelayout/databases/";

    private SQLiteDatabase tuppDatabase;

    private final Context dbContext;

    public DatabaseHelper (final Context context){
        super(context, DB_NAME, null, 5);
        this.dbContext = context;
        //dbContext.deleteDatabase("tupperware.db"); //USE THIS IF YOU MESS THE DATABASE UP AND YOU NEED TO REINSTALL IT.
        Log.i("DB_PATH", DB_PATH);
    }

    public void createDataBase() throws IOException {
        boolean dbExist = checkDataBase();
        Log.i("DATABASE EXIST", "boolean dbExist is " + dbExist);

        if (dbExist){
            //do nothing because the tupperware.db exists
        }else{
            //File file = new File(DB_PATH + DB_NAME);
            this.getReadableDatabase();
            //this.getWritableDatabase();
            try{
                copyDataBase();
                this.close();
            }catch (IOException e){
                Log.i("THE_ERROR", e.toString());
                throw new Error("Error copying new database");
            }
        }
    }

    private boolean checkDataBase(){
        SQLiteDatabase checkDB = null;
        try{
            String myDBPath = DB_PATH + DB_NAME;
            File file = new File(myDBPath);
            if (file.exists() && !file.isDirectory())
                checkDB = SQLiteDatabase.openDatabase(myDBPath, null, SQLiteDatabase.OPEN_READONLY);
        }catch (SQLiteException e){
        }

        if (checkDB != null){
            checkDB.close();
        }

        return checkDB != null ? true : false;
    }

    private void copyDataBase() throws IOException {
        InputStream inputStream = dbContext.getAssets().open(DB_NAME);
        String outFileName = DB_PATH + DB_NAME;
        OutputStream outputStream = new FileOutputStream(outFileName);

        byte[] buffer = new byte[1024];
        int length;
        while ((length = inputStream.read(buffer)) > 0){
            outputStream.write(buffer, 0, length);
        }
        outputStream.flush();
        outputStream.close();
        inputStream.close();
    }

    public void openDataBase() throws SQLException {
        String dbPath = DB_PATH + DB_NAME;
        tuppDatabase = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READWRITE);
        tuppDatabase.close();
    }

    @Override
    public void onCreate(SQLiteDatabase db){
    }

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

Доступ к базе данных работает отлично уже около 6 месяцев, поэтому я понятия не имею, что делать на этом этапе.Пожалуйста, дайте мне знать, если вы можете помочь.Спасибо!!!!

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