Android:从资产文件夹复制已填充的sqlite数据库无法正常工作并导致错误

时间:2018-09-25 02:10:34

标签: android sqlite

*****我想通了********* 很抱歉浪费任何人的时间,但我知道我做错了什么。我使用dbcontext.deletedatabase(“ tupperware.db”)这行是因为我认为它会删除像素xl存储的数据库,以便可以从资产中复制新数据库。我仍然不完全了解它是如何工作的,但是显然该行正在干扰数据库副本并导致没有表被复制的空数据库。我试图在没有这一行代码的情况下复制数据库,并将其复制过来,我的应用程序现在又可以工作了。谢谢大家的帮助!!!这行下面是我问的原始问题*********************************

我正在使用sqlite数据库的应用程序在android studio 3.1.4中工作。

我正在运行Android版本9的Google Pixel XL手机上测试该应用程序。

我想使用代码删除数据库,然后将另一个数据库(具有相同的名称和表...数据更少)从android studio的资产文件夹复制到pixel xl,以便我的应用可以访问它。当我尝试此操作时,应用程序现在崩溃,给我以下错误...

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

我写了一些代码来检查数据库是否存在,并返回“ true”表示数据库存在。另外,在android studio中,我打开了“视图”>“工具窗口”>“设备文件资源管理器”,然后可以看到该数据库应该位于(在data / data / MY PACKAGE INFO / databases中),以及具有db-shm和db-wal扩展。但是,我注意到该数据库只有12kb,而我放置在assets文件夹中的数据库为156kb,因此我将12kb数据库保存到我的计算机中,并使用DB Browser for 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个月以来,对数据库的访问已完全正常,因此我不知道该怎么办。如果您可以提供帮助,请告诉我。谢谢!!!!

0 个答案:

没有答案