*****我想通了********* 很抱歉浪费任何人的时间,但我知道我做错了什么。我使用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个月以来,对数据库的访问已完全正常,因此我不知道该怎么办。如果您可以提供帮助,请告诉我。谢谢!!!!