2013-06-01 3 views
1

Я разработал приложение, имеющее базу данных в папке с ресурсами. Копия базы данных из папки с данными на устройство во время выполнения. Код выглядит следующим образом:Обновление базы данных SQLite не отражается

public class DataBaseHelperClass extends SQLiteOpenHelper{ 
private final Context context; 

private static String DB_PATH = ""; 
// Data Base Name. 
private static final String DATABASE_NAME = "db.sqlite"; 
// Data Base Version. 
private static final int DATABASE_VERSION = 1; 
// Table Names of Data Base. 
static final String TABLE = "MyTable"; 

static SQLiteDatabase sqliteDataBase; 

@SuppressLint("SdCardPath") 
public DataBaseHelperClass(Context context) {  
    super(context, DATABASE_NAME, null ,DATABASE_VERSION); 
    this.context = context; 
    //The Android's default system path of your application database. 
    DB_PATH = "/data/data/com.abc.myapp/databases/"; 
} 

public void createDataBase() throws IOException{ 
    //check if the database exists 
    boolean databaseExist = checkDataBase(); 

    if(databaseExist){ 
     this.getWritableDatabase(); 
    }else{ 
     this.getReadableDatabase(); 
     copyDataBase(); 
    }// end if else dbExist 
} // end createDataBase(). 

public boolean checkDataBase(){ 
    File databaseFile = new File(DB_PATH + DATABASE_NAME); 
    return databaseFile.exists();   
} 

private void copyDataBase() throws IOException{ 
    //Open your local db as the input stream 
    InputStream myInput = context.getAssets().open(DATABASE_NAME); 
    // Path to the just created empty db 
    String outFileName = DB_PATH + DATABASE_NAME; 
    //Open the empty db as the output stream 
    OutputStream myOutput = new FileOutputStream(outFileName); 
    //transfer bytes from the input file to the output file 
    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 + DATABASE_NAME; 
    sqliteDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); 
} 

@Override 
public synchronized void close() { 
    if(sqliteDataBase != null) 
     sqliteDataBase.close(); 
    super.close(); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    // No need to write the create table query. 
    // As we are using Pre built data base. 
    // Which is ReadOnly. 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

} 

Этот код работает нормально. Но теперь я сделал некоторые изменения в базе данных, как:

Я создал новую таблицу в базе данных,

Изменить записи и добавления записей в существующую таблицу.

И изменил OnUpdate из базы данных вспомогательного класса, как:

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    if(newVersion > oldVersion){ 
     //db.execSQL("DROP TABLE IF EXISTS " + DATABASE_NAME); 
     context.deleteDatabase(DATABASE_NAME); 
    } 
} 

и увеличить версию базы данных от 1 до 2.

сгенерированного нового APK и установить в устройстве. Он заменяет старое приложение и устанавливает новый, но измененные в базе данных не отражают.

Теперь, что я должен сделать, чтобы удалить базу данных старой версии и скопировать новую базу данных из папки с данными на устройство во время обновления приложения.

Пожалуйста, направляйте меня по этой проблеме, поскольку я ищу в Google по этому вопросу, но не получил никакого рабочего решения для удаления и обновления новой базы данных.

ответ

0

Ваш OnCreate() должно быть:

@Override 
public void onCreate(SQLiteDatabase db){ 
    createDB(); 
} 

OnUpgrade() Является ли:

@Override 
public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion){ 
    db.execSQL("DROP TABLE IF EXISTS " + DB_TABLE); 
    onCreate(db); 
} 

CreateDatabase(), как:

public void createDataBase(){ 
    boolean dbExist = dbExists(); 
    if(!dbExist){ 
     copyDataBase(); 
    } 
    else if(dbExist){ 
     copyDataBase(); 
    } 
} 

Тогда он будет работать нормально.

+0

Кажется, что два ваших ответа с фактически небольшим добавлением были немедленно приняты @ManojFegde. Если вы один и тот же человек, вы делаете это неправильно. У вас может быть несколько учетных записей, но нехорошо действовать так, чтобы в играх была система репутации. – laalto

2

Вы можете использовать этот код для вашей помощи, как:

public class DataBaseHelper extends SQLiteOpenHelper { 

private static final String DB_PATH = "/data/data/com.project.mydb/databases/"; 
private static final String DB_NAME = "mydb.db"; 
private static final String DB_TABLE = "words"; 
private static final int DB_VERSION = 6; 
private static final String TAG = "DataBaseHelper"; 
int id = 0; 
Random random = new Random(); 
private SQLiteDatabase myDataBase; 
private final Context myContext; 

public DataBaseHelper(Context context){ 
    super(context, DB_NAME, null, DB_VERSION); 
    this.myContext = context; 
} 

@Override 
public void onCreate(SQLiteDatabase db){ 
    createDB(); 
} 

@Override 
public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion){ 
    Log.w(TAG, "Upgrading DB from version " + oldVersion + " to " + 
      newVersion + ", which will destroy all old data"); 
    db.execSQL("DROP TABLE IF EXISTS " + DB_TABLE); 
    onCreate(db); 
} 

public void createDataBase(){ 
    createDB(); 
} 

private void createDB(){ 
    boolean dbExist = dbExists(); 
    if(!dbExist){ 
     copyDataBase(); 
    } 
    else if(dbExist){ 
     copyDataBase(); 
    } 
} 

private boolean dbExists(){ 
    SQLiteDatabase db = null; 
    try{ 
     String dbPath = DB_PATH + DB_NAME; 
     db = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READWRITE); 
     db.setLocale(Locale.getDefault()); 
     db.setLockingEnabled(true); 
     db.setVersion(DB_VERSION); 
    } 
    catch(SQLiteException e){ 
     Log.e("SQL Helper", "database not found"); 
    } 
    if(db != null){ 
     db.close(); 
    } 
    return db != null ? true : false; 
} 

private void copyDataBase(){ 
    InputStream iStream = null; 
    OutputStream oStream = null; 
    String outFilePath = DB_PATH + DB_NAME; 
    try{ 
     iStream = myContext.getAssets().open(DB_NAME); 
     oStream = new FileOutputStream(outFilePath); 
     byte[] buffer = new byte[1024]; 
     int length; 
     while((length = iStream.read(buffer))>0){ 
      oStream.write(buffer,0,length); 
     } 
     oStream.flush(); 
     oStream.close(); 
     iStream.close(); 
    } 
    catch(IOException ioe){ 
     throw new Error("Problem copying database from resource file."); 
    } 
} 

public void openDataBase() throws SQLException { 
    String myPath = DB_PATH + DB_NAME; 
    myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); 
} 

@Override 
public synchronized void close(){ 
    if (myDataBase != null) 
     myDataBase.close(); 
    super.close(); 
} 
} 

Надеется, что это поможет вам.

Смежные вопросы