在Android P之前,我的代码一切正常,但现在在Android P中,我在使用数据库时遇到了很多问题。
我有.db SQLite数据库文件存储在资产文件夹中。我正在将它们导入Android的数据库空间,直到Android P它工作正常。在Android P中,我得到这个异常:第一个月
我在这里搜索并找到了这个,我试图应用公认的答案:安卓P - 'SQLite:从资产复制数据库后出现“无此类表错误
问题是,现在我有另一个问题,它仍然不工作。现在我有问题,每次我试图检查数据库是否已经存在,这段代码总是返回真,所以我从来没有创建数据库。即使数据库没有创建,即使应用程序最近安装:
private boolean checkIfDBExists() {
File dbFile = new File(DB_COMPLETE_PATH);
return dbFile.exists();
}
我的源代码是前面引用的堆栈溢出问题中被接受答案的源代码。
新的Android P需要获取DB路径的方式:
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();
}
}
5条答案
按热度按时间rkttyhzu1#
Arg在
this.getReadableDatabase();
之后添加this.close();
最终解决了该问题该打开的连接正在生成原始的no such table异常
所以我使用了Util.getDatabasePath(DB_NAME);而不是Android P中提出的复杂解决方案-“SQLite:从资产复制数据库后出现“无此类表错误”,现在代码更简单
非常感谢@生活方式,他们发现了真实的的问题。
现在代码简单多了:
ifsvaxew2#
在DBHelper类中,您将在测试方法Util.getDatabasePath(DB_NAME)中是否存在DB之前创建DB。
通过调用此方法,SQL打开帮助器创建数据库(在本例中为空,因为在OnCreate()方法中没有发生任何事情)。
如果您将数据库存储在默认应用程序的数据库路径中,则可以通过下一个代码段检查数据库是否存在:
禁用WAL的更好位置是SQLiteOpenHelper中的onConfigure()方法
ddrv8njm3#
将此路径添加到数据库
eoxn13cs4#
事实上,我已经把SQLiteDatabase的对象作为静态的,所以我得到了这个问题。
polkgigr5#
我的Android P问题通过在
this.getReadableDatabase();
之后添加this.close();
得到了解决