2015-01-28 2 views
0

Мое приложение будет корабль с SQLite базы данных в своих активов папки, которые будут копируются в папку базы данных после запуска.Android sqliteOpenHelper onUpgrade замена дб с новым одним

Теперь, когда я выпускаю новую версию своего приложения с новой базой данных sqlite, будет вызвана onUpgrade? Если бы это помогло удалить текущую базу данных и вызвать oncreate (что называется моим копированием функции базы данных)?

Ps: База данных не содержит каких-либо пользовательских данных

EDIT: Вот мой вспомогательный класс для обработки к базе данных

public class Helper_Db extends SQLiteOpenHelper{ 

    public static final String DB_NAME = "Test.sqlite"; 
    public static final int DB_VERSION = 3; 
    private static String DB_PATH = ""; 
    private SQLiteDatabase _db; 
    private final Context _ctx; 

    public Helper_Db(Context context) { 
     super(context, null, null, 1); 
     DB_PATH = "/data/data/" + context.getPackageName() + "/databases/"; 
     _ctx = context; 
} 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     try 
     { 
      copyDatabase(); 
      Log.e("DATABASE", "Database created"); 
     } 
     catch(IOException io) 
     { 
      Log.e("DATABASE", io.toString()); 
     } 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     _ctx.deleteDatabase(DB_NAME); 
     onCreate(db); 
    }  

    private void copyDatabase() throws IOException 
    { 
     InputStream input = _ctx.getAssets().open(DB_NAME); 
     String outFileName = DB_PATH + DB_NAME; 
     OutputStream output = new FileOutputStream(outFileName); 
     byte [] buffer = new byte [1024]; 
     int length; 
     while((length = input.read(buffer)) > 0) 
     { 
      output.write(buffer, 0, length); 
     } 
     output.flush(); 
     output.close(); 
     input.close(); 
    } 

    public boolean openDatabase() throws SQLException 
    { 
     String path = DB_PATH + DB_NAME; 
     _db = SQLiteDatabase.openDatabase(path, null, 
       SQLiteDatabase.CREATE_IF_NECESSARY); 
     return _db != null; 
    } 

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

ответ

1

каждая база данных (SQLite) имеет версию внутреннего пользователя (вы можете получить его с помощью PRAGMA user_version;). При открытии в коде базы данных с

SQLiteDatabase db = db = SQLiteDatabase.openDatabase(..) 

вы должны затем сделать что-то вроде

db.beginTransaction(); 
    try { 
     // update if needed 
     if (dbVersion > db.getVersion()) { 
      upgrade(db); 

      // set database version to last one 
      db.setVersion(dbVersion); 
     } 

     // end transaction 
     db.setTransactionSuccessful(); 
    } finally { 
     db.endTransaction(); 
    } 

Так обновить это только на вас.

Я действительно предлагаю проверить этот вспомогательный класс http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html, который может сделать для вас большую часть грязной работы.

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

Надеется, что это помогает

+0

Спасибо за ответ, я использую этот вспомогательный класс уже и не база данных не хранит какое-либо пользовательские данные, так в основном я хочу перевести базу данных для предыдущей версии приложения в стороне и скопировать загружаемая база данных новой версии приложения в папку баз данных (перезаписывать?) Является ли эта функция onUpgrade для вспомогательного класса вызывается, когда приложение обновляется до более новой версии? Любые указания для простой перезаписи базы данных? thanx –

+0

onUpgrade не вызывается после обновления приложения. Проверьте этот конструктор и его описание: http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#SQLiteOpenHelper%28android.content.Context,%20java.lang.String,%20android.database.sqlite .SQLiteDatabase.CursorFactory,% 20int% 29. Важным является параметр «версия». –

+0

Хм, если вы просто хотите перезаписать базу данных после обновления вашего приложения, я думаю, что лучшее место должно быть как можно скорее после запуска приложения. В этом случае вы можете расширить класс «Приложение» и проверить, является ли начало приложения обновлением, и если это так, просто перезапишите файл базы данных, прежде чем использовать SqliteOpenHelper для работы с базой данных. Существует много других сообщений с информацией о том, как расширить класс приложений и как проверить, обновлено ли приложение (может предлагать способ благодаря сохранению параметров в SharedPreferences). –

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