Android 脆弱的SQLite实现-如何改进?
我的应用程序严重依赖于数据库,当应用程序第一次打开时,它应该将自己从Android 脆弱的SQLite实现-如何改进?,android,sqlite,Android,Sqlite,我的应用程序严重依赖于数据库,当应用程序第一次打开时,它应该将自己从/assets/文件夹复制到数据库存储中。然而,它似乎令人难以置信的喜怒无常:例如,我的免费和付费版本中的代码几乎完全相同,但其中一个目前正在工作,另一个则没有 你们介意看一下我的代码,看看有什么可以改进的地方吗?可以找到我的SQLiteOpenHelper,我的DataProvider的onCreate()方法如下: @Override public boolean onCreate() { dh = new Dat
/assets/
文件夹复制到数据库存储中。然而,它似乎令人难以置信的喜怒无常:例如,我的免费和付费版本中的代码几乎完全相同,但其中一个目前正在工作,另一个则没有
你们介意看一下我的代码,看看有什么可以改进的地方吗?可以找到我的SQLiteOpenHelper
,我的DataProvider
的onCreate()
方法如下:
@Override
public boolean onCreate() {
dh = new DatabaseHelper(getContext());
try {
dh.createDataBase();
} catch (IOException ex) {
}
try {
dh.openDataBase();
} catch (SQLiteException ex) {
Toast.makeText(getContext(), "The database could not be copied\n" + ex.getMessage(),
Toast.LENGTH_LONG).show();
}
return true;
}
谢谢
编辑
在试用了emulator之后,我知道数据库存在,但出于某种原因,它只是不想读取它…下面是我用来复制数据库的代码(不确定它是否可以修复错误,我认为另一种方法总是值得一试)。否则,我看不到任何可能导致错误的跳出
void copyFile(File src, File dst) throws IOException {
FileChannel inChannel = new FileInputStream(src).getChannel();
FileChannel outChannel = new FileOutputStream(dst).getChannel();
try {
inChannel.transferTo(0, inChannel.size(), outChannel);
} finally {
if (inChannel != null)
inChannel.close();
if (outChannel != null)
outChannel.close();
}
}
另外,在检查数据库是否存在时,为什么要打开和关闭数据库。看来你可以这样做:
private boolean checkDataBase() {
String myPath = DB_PATH + DB_NAME;
return new File(myPath).exists();
}
您不应该对数据库目录的路径进行硬编码。不要每次需要时都构建myPath,而是尝试使用以下代码在构造函数中构建它: 实例:
private File myPath;
在构造器中:
myPath = context.getDatabasePath(DB_NAME);
如果有帮助的话,我当前得到的错误是,由于找不到表,对db的查询失败。我不知道这些表是否存在,虽然我没有收到错误,说不能复制。数据库有多大(mb)?@Farray,60KB太小了