Mantenere lo stesso database SQLite durante l’aggiornamento e l’app Android dalla versione Lite alla versione Pro

Prima di tutto ho fatto una ricerca e non riesco a trovare una risposta specifica alla mia domanda, quindi ecco qui …

Sto scrivendo la mia prima applicazione Android e sto pianificando di avere una versione Lite (funzioni limitate) e una versione a pagamento (tutte le funzionalità).

La versione Lite e Pro utilizzerà la stessa struttura di database SQLite e, se l’utente inizia con la versione Lite e si aggiorna alla versione Pro, non voglio che perda i dati che hanno creato nella versione Lite.

Visto che le versioni Lite e Pro dovranno (a quanto mi risulta) essere in pacchetti separati per consentire all’Android Market di distinguerli, in che modo la versione Pro può vedere il database Lite?

Molte grazie in anticipo per le vostre risposte.

Quello che ho fatto e sembra funzionare per Hexaddicus, è che entrambe le versioni Lite e Pro vengono eseguite come lo stesso utente e quindi alla prima esecuzione della versione Pro, copia il database Lite. Quindi informare l’utente della copia.

Imposta android:sharedUserId per essere uguale in entrambi i prodotti …

  

E poi il codice per copiare il DB …

  try { final Context free_context = this.createPackageContext("com.mycompany.package", Context.CONTEXT_INCLUDE_CODE); final File full_db = this.getDatabasePath(GameData.DATABASE_NAME); final File full_db_dir = full_db.getParentFile(); final File free_db = free_context.getDatabasePath(GameData.DATABASE_NAME); final File free_db_dir = free_db.getParentFile(); if (free_db.exists() == false) return; if (full_db_dir.exists() == false) full_db_dir.mkdir(); if (full_db.exists() == false) full_db.createNewFile(); FileUtils.copyDirectory(free_db_dir, full_db_dir); this.gameData.getWritableDatabase(); } catch (NameNotFoundException e) { /* do nothing here since this is an semi expected case */ Log.w("mytag", "No Lite version found"); } catch (IOException e) { Log.w("mytag", "Failed to create file"); } } 

L’unico lato negativo di questo è che una volta eseguita la copia, non c’è sincronizzazione tra le due versioni. È inoltre necessario assicurarsi che l’utente della versione Lite stia eseguendo una versione in esecuzione come sharedUserId o che la copia abbia esito negativo.

Aggiornamento: si prega di prendere in considerazione i commenti di ChrisCashwells e di rispondere anche da quando ha portato un punto valido e non riesco a ricordare cosa ho fatto nel suo esempio.

Se ansible, potresti voler fare più di un approccio di “sblocco” rispetto a un’app a pagamento separata. In questo modo utilizzi sempre un solo pacchetto. Se per nessun altro motivo, eviterai il problema della proprietà del database.

Utilizzando lo stesso android:sharedUserId sarebbe un buon approccio se la tua app ha già un set. In caso contrario, annullerai l’accesso a tutti i dati dei tuoi utenti se invii un aggiornamento che ha un set. Se stai iniziando dal punto zero e non hai già un’app in sharedUserId con gli utenti che si aspettano di conservare i propri dati, imposta definitivamente un sharedUserId dal primo giorno.

Come @Chris ha detto che è ansible utilizzare l’approccio “sblocco”, lo spiegherò come faccio in tali condizioni.

Puoi avere una tabella come “Funzionalità” dovrebbe avere una colonna / flag IsAvailable. Se si desidera limitare alcune funzionalità, è ansible impostare il flag IsAvailable su FALSE.

Se si hanno modifiche nella struttura del DB, è necessario aggiornare il DB utilizzando:

 @Override public void onUpgrade() { if (condition == true) // alter table }