2015-01-20 2 views
0

То, что я пытаюсь достичь, это то, что мое приложение будет поставляться с существующей базой данных sqlite, экспортированной с моей веб-панели, с некоторыми записями (новостями, продуктами, категориями и т. Д.) И позже он будет вставлять в него некоторые записи (скажем, он будет вставлять уведомления, которые он получает), и он будет скопирован в папку с базами данных, до этого нет проблем , но моя забота - когда пользователь обновляет их применение через рынок. Я хочу заменить новую базу данных на старую, но сохранить эти записи, созданные приложением, (уведомления, полученные ею), и вставить их в новую. Вот мой код до сих пор: (пожалуйста, повысьте, если необходимо)android onUpgrade перемещение некоторых записей из старого db в новый db

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) { 
     //take out the notifications from old db 
     //insert them into the new db 
     //delete the old db 
     //copy the new 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(); 
    } 

} 

Заранее спасибо.

ответ

0

Я делаю что-то подобное. У меня есть контент по умолчанию в базе данных, которую я отправляю с приложением, которое иногда меняется. Однако у меня есть обычная программа для синхронизации баз данных для синхронизации между пользователями и с резервными копиями, и каждый раз, когда я обновляю БД, я просто беру включенную БД и синхронизирую ее с существующей пользовательской БД.

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

Итак, моя рекомендация состоит в том, чтобы создать целочисленный столбец в каждой таблице базы данных, называемый «IncludedContent», и установить его равным 1 во всех данных, которые вы включили в свою отправленную базу данных, и установить значение по умолчанию 0, что и есть все пользовательский контент будет иметь. Тогда все, что вам нужно, так это присоединить базы данных с помощью Attach command что-то вроде этого:

db.execSQL("ATTACH DATABASE ? AS Old_DB", new String[]{fullPathToOldDB}); 

, а затем делать вставки, как это скопировать только пользовательский контент:

db.execSQL("INSERT INTO New_DB.TABLE SELECT * FROM Old_DB.TABLE WHERE IncludedContent = 0"); 
Смежные вопросы