我创建了一个虚拟READONLY数据库,以确保我正确连接和应用程序读取。校验!有了这个工作,现在我通过sqlite管理器更新了数据库,但我读到覆盖现有的预先填充的数据库可能会造成严重破坏,所以我决定使用不同的名称导出新更新的版本。请注意,我使用与第一个相同的sqlite扩展名(它仍然可以)以相同的方式导出它但是这个会抛出以下加密/损坏的文件异常
android.database.sqlite.SQLiteDatabaseCorruptException:文件已加密或不是数据库(代码26)
我将新数据库复制并粘贴到assests文件夹中,然后继续注释掉旧的DB_NAME,然后用新的DB_NAME2替换代码的所有区域
我不明白为什么如果我连接它的方式与我之前的工作方式相同,这就不起作用
public class DataBaseHelper extends SQLiteOpenHelper {
private static String DB_PATH;
private static final String DB_NAME2 = "DummyTestTwo.sqlite";
// private static final String DB_NAME = "DummyTestOne.sqlite";
private SQLiteDatabase mDataBase;
private final Context mContext;
public static final String DBTABLENAME = "questiontable";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_NAME = "question";
public static final String COLUMN_FID = "fid";
public DataBaseHelper(Context context) {
super(context, DB_NAME2, null, 2);
this.mContext = context;
DB_PATH = context.getDatabasePath(DB_NAME2).getPath();
}
public void createDataBase() {
boolean dbExist = checkDataBase();
if (dbExist) {
} else {
this.getReadableDatabase();
// this.getWritableDatabase();
try {
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}
private boolean checkDataBase() {
SQLiteDatabase checkDB = null;
try {
checkDB = SQLiteDatabase.openDatabase(DB_PATH, null, SQLiteDatabase.OPEN_READONLY);
} catch (SQLiteException e) {
Log.e(this.getClass().toString(), "Error while checking db");
}
if (checkDB != null) {
checkDB.close();
}
return checkDB != null ? true : false;
}
private void copyDataBase() throws IOException {
InputStream externalDbStream = mContext.getAssets().open(DB_NAME2);
OutputStream localDbStream = new FileOutputStream(DB_PATH);
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = externalDbStream.read(buffer)) > 0) {
localDbStream.write(buffer, 0, bytesRead);
}
//Close the streams
localDbStream.flush();
localDbStream.close();
externalDbStream.close();
}
public void openDataBase() throws SQLException {
mDataBase = SQLiteDatabase.openDatabase(DB_PATH, null, SQLiteDatabase.OPEN_READONLY);
}
@Override
public synchronized void close() {
if (mDataBase != null) {
mDataBase.close();
}
super.close();
}
public Cursor getCursorForAllQs() {
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
queryBuilder.setTables(DBTABLENAME);
String[] asColumnsToReturn = new String[]{COLUMN_ID, COLUMN_NAME};
Cursor mCursor = queryBuilder.query(mDataBase, asColumnsToReturn, null,
null, null, null, "_id");
return mCursor;
}
public String getName(Cursor c) {
return (c.getString(1));
}
// public String getFid(Cursor c) {
// return (c.getString(2));
// }
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
答案 0 :(得分:0)
这是我找到的为我工作的解决方案。首先,我将两个db文件保存在我的assets文件夹中,并增加了数据库版本号。取消注释旧数据库,然后更改以下方法。
public void openDataBase() throws SQLException {
//mDataBase = SQLiteDatabase.openDatabase(DB_PATH, null, SQLiteDatabase.OPEN_READONLY);
mDataBase = this.getReadableDatabase();
}
另外,我将以下内容添加到 onUpgrade()
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (newVersion == 4) {
Log.e("WORKED!!", "onUpgrade executed");
}
if (newVersion > oldVersion) {
InputStream inputStream = null;
OutputStream outputStream = null;
String dbFilePath = DB_PATH + DB_NAME;
try {
inputStream = mContext.getAssets().open(DB_NAME2);
outputStream = new FileOutputStream(dbFilePath);
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, length);
}
outputStream.flush();
outputStream.close();
inputStream.close();
} catch (IOException e) {
throw new Error("Problem copying database from resource file.");
}
}
}