Java 替换sqlite表单资产
首先为我的英语不好感到抱歉,因为我是法国人^^ 尝试用新数据库替换旧数据库时遇到问题以下是我的代码:Java 替换sqlite表单资产,java,android,sqlite,Java,Android,Sqlite,首先为我的英语不好感到抱歉,因为我是法国人^^ 尝试用新数据库替换旧数据库时遇到问题以下是我的代码: //**************************** public static String DB_PATH; //**************************** public static String DB_NAME; public SQLiteDatabase database; public final Context context; private static
//****************************
public static String DB_PATH;
//****************************
public static String DB_NAME;
public SQLiteDatabase database;
public final Context context;
private static final String spots = "spots";
public static final int DATABASE_VERSION = 3;
public SQLiteDatabase getDb() {
return database;
}
public ExternalDbOpenHelper(Context context, String databaseName) {
super(context, databaseName, null, DATABASE_VERSION);
this.context = context;
String packageName = context.getPackageName();
DB_PATH = String.format("//data//data//%s//databases//", packageName);
DB_NAME = databaseName;
openDataBase();
}
public void createDataBase() {
boolean dbExist = checkDataBase();
if (!dbExist) {
this.getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
Log.e(this.getClass().toString(), "Erreur pendant la copie de la base");
throw new Error("Erreur pendant la copie de la base!");
}
} else {
Log.i(this.getClass().toString(), "La base de donnée existe déja");
}
}
private boolean checkDataBase() {
SQLiteDatabase checkDb = null;
try {
String path = DB_PATH + DB_NAME;
checkDb = SQLiteDatabase.openDatabase(path, null,
SQLiteDatabase.OPEN_READONLY);
} catch (SQLException e) {
Log.e(this.getClass().toString(), "Erreur pendant la vérification de la base");
}
if (checkDb != null) {
checkDb.close();
}
return checkDb != null;
}
private void copyDataBase() throws IOException {
InputStream externalDbStream = context.getAssets().open(DB_NAME);
String outFileName = DB_PATH + DB_NAME;
OutputStream localDbStream = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = externalDbStream.read(buffer)) > 0) {
localDbStream.write(buffer, 0, bytesRead);
}
localDbStream.close();
externalDbStream.close();
}
public SQLiteDatabase openDataBase() throws SQLException {
String path = DB_PATH + DB_NAME;
if (database == null) {
createDataBase();
database = SQLiteDatabase.openDatabase(path, null,
SQLiteDatabase.OPEN_READWRITE);
}
return database;
}
@Override
public synchronized void close() {
if (database != null) {
database.close();
}
super.close();
}
@Override
public void onCreate(SQLiteDatabase db) {this.getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
Log.e(this.getClass().toString(), "Erreur pendant la mise à jour de la base");
throw new Error("Erreur pendant la copie de la mise à jour de la base!");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.e(this.getClass().toString(), "Mise à jour de la base " + oldVersion + " vers " + newVersion );
database.execSQL("DROP TABLE IF EXISTS " + spots + ";");
onCreate(database); //Creates a new one
}
}
当我把数据库_VERSION=4放入数据库时,数据库没有被新的数据库替换。你能解释一下为什么要替换它吗。
谢谢。当您实例化ExternalDbOpenHelper并检测到新版本时,将调用onUpgrade()。onUpgrade()的实现删除表点,然后调用onCreate()两次。但是,您的onCreate()方法为空。很抱歉,我刚刚复制了我所做的测试,以查看它是否崩溃。。应该只有onCreate(数据库);但是当我输入数字4时,我没有在我的logcat上看到“Miseájour de la base”+oldVersion+“vers”+newVersion,这意味着没有调用onUpgrade…不管怎样,onCreate()方法没有实现(即,它是空的)。如果没有调用onUpgrade(),那么检查安装的数据库的版本。尝试手动设置新数据库版本以强制升级,如db.setVersion(database_version);你能给我发一个测试版本的例子吗?因为我不知道这个版本号存储在哪里。