tôi sử dụng hướng dẫn này: Tutorial Custom databaseNâng cấp cơ sở dữ liệu SQLite mà tôi sao chép từ thư mục nội dung (Android)
sao chép cơ sở dữ liệu từ thư mục tài sản và sao chép nó vào điện thoại của mình (hoặc giả lập). Mọi thứ đều chính xác. Tôi thấy cơ sở dữ liệu của tôi trong quan điểm DDMS. Nhưng tôi muốn aslo nâng cấp cơ sở dữ liệu của tôi đôi khi vì vậy tôi đã làm:
super(context, DB_NAME, null, 2); //changed version from 1 to 2
và sửa đổi onUpgrade phương pháp:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if(newVersion > oldVersion){
this.myContext.deleteDatabase(DB_NAME);
try {
this.copyDataBase();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Nhưng sau khi chạy tôi vẫn còn có phiên bản cũ của cơ sở dữ liệu trên điện thoại của tôi. Làm thế nào tôi có thể xóa phiên bản cũ của cơ sở dữ liệu và sao chép mới. DB_NAME là tên cơ sở dữ liệu của tôi (có định dạng, nhưng không phải đường dẫn) và copyDataBase() là phương thức sao chép cơ sở dữ liệu vào thiết bị (và nó hoạt động).
tôi dán tất cả các mã của tôi:
public class DataBaseHelper extends SQLiteOpenHelper{
private static String DB_PATH = "/data/data/sitcom.quiz/databases/";
private static String DB_NAME = "sitcoms.sqlite";
private SQLiteDatabase myDataBase;
private final Context myContext;
public DataBaseHelper(Context context) {
super(context, DB_NAME, null, 4);
this.myContext = context;
}
public void createDataBase() throws IOException{
boolean dbExist = checkDataBase();
if(dbExist){
//do nothing - database already exist
}else{
this.getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}
private boolean checkDataBase(){
SQLiteDatabase checkDB = null;
try{
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
}catch(SQLiteException e){
//database does't exist yet.
}
if(checkDB != null){
checkDB.close();
}
return checkDB != null ? true : false;
}
private void copyDataBase() throws IOException{
//Open your local db as the input stream
InputStream myInput = myContext.getAssets().open(DB_NAME);
// Path to the just created empty db
String outFileName = DB_PATH + DB_NAME;
//Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);
//transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer))>0){
myOutput.write(buffer, 0, length);
}
//Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
}
public void openDataBase() throws SQLException{
//Open the database
String myPath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
}
@Override
public synchronized void close() {
if(myDataBase != null)
myDataBase.close();
super.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.d("adas", "dasd");
if(newVersion > oldVersion){
String myPath = DB_PATH + DB_NAME;
this.myContext.deleteDatabase(myPath);
try {
this.copyDataBase();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
và hoạt động của tôi:
DataBaseHelper myDbHelper = new DataBaseHelper(this);
myDbHelper = new DataBaseHelper(this);
try {
myDbHelper.createDataBase();
} catch (IOException ioe) {
throw new Error("Unable to create database");
}
try {
myDbHelper.openDataBase();
}catch(SQLException sqle){
throw sqle;
}
Cảm ơn nếu bạn có thể cho tôi lý do hay chỉ gợi ý tại sao công việc t don này'.
Vâng, bạn là đúng. Tôi đã làm gì ? Tôi đã sử dụng tùy chọn chia sẻ để ký phiên bản mới của cơ sở dữ liệu và tôi xóa cơ sở dữ liệu trước khi tôi sử dụng đối tượng này. Cảm ơn. – kolek
@kolek: Bạn có thể chia sẻ giải pháp với mọi người không? Tôi cũng cần một cái gì đó tương tự. –
Tại sao bạn không chia sẻ giải pháp, Kolek? Làm ơn, nhiều người cần nó. –