2011-08-03 17 views
7

Stavo appena iniziando a lavorare su un'applicazione di database quando ho realizzato che dovevo implementare il modello MVC poiché l'applicazione è piuttosto complessa e comporta un numero di operazioni del database.
Per quanto riguarda questo, ho deciso di creare un separato model class per la gestione delle operazioni del database. Questa classe avrà tutti i metodi che mi restituiranno i dati dopo l'esecuzione del comando Sqlite (Seleziona per esempio) OPPURE eseguirà semplicemente il comando SQLite (Elimina per esempio). Ma quello che voglio è separare questa classe dalla classe Database Adapter, dove apro, creo e chiudo il mio database.
Mi permetta di mettere il mio concetto in codice:Creazione della classe del modello di dati per la gestione del database

public class DataModel 
{ 
/* 

Private members 

*/ 

// Method to Select data from Student table 
public ArrayList<String> FetchStudents (parameter 1) 
{ 
private ArrayList<String> arrStudent; 


DatabaseAdapter objDB= new DatabaseAdapter(); 
objDB.open(); 
/* 
Some code 
*/ 
objDB.close(); 


return arrStudent 
} 

//Method to delete record from Student table 
public DeleteStudent(parameter 1) 
{ 
DatabaseAdapter objDB= new DatabaseAdapter(); 
objDB.open(); 
//Some code 
objDB.close(); 
} 

/* 

Rest of methods 

*/ 
} 

// DatabaseAdapterClass

private static class DatabaseHelper extends SQLiteOpenHelper { 
DatabaseHelper(Context context) { 
super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 
/** 
* onCreate method is called for the 1st time when database doesn't exists. 
*/ 
@Override 
public void onCreate(SQLiteDatabase db) { 
Log.i(TAG, "Creating DataBase: " + CREATE_STUDENT_TABLE); 
db.execSQL(CREATE_STUDENT_TABLE); 
} 
/** 
* onUpgrade method is called when database version changes. 
*/ 
@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
Log.w(TAG, "Upgrading database from version " + oldVersion + " to " 
         + newVersion); 
} 
} 

Domanda:
Quello che voglio porre è questo l'approccio corretto di implementazione? Va bene se creare una classe separata per i metodi di database ? Quali limitazioni o problemi pensate potreste turbarmi più tardi? Inoltre, c'è un modo migliore per implementare il concetto di cui sopra?

Grazie
Pietra

risposta

11

Ciò a cui si fa riferimento come "classe modello" è più comunemente noto come oggetto accesso dati (DAO). Il tuo modello sarebbe di solito un insieme di classi che mantengono i tuoi dati e la tua logica aziendale. Nel tuo caso, probabilmente una classe Student con proprietà di ID, nome, GPA, ecc. Se si desidera separare l'accesso ai dati dal modello, si avrà la classe di accesso ai dati (DatabaseHelper) interrogare il database e utilizzare i dati che ottiene per restituire oggetti Student o List<Student>. Non c'è davvero molto da fare nel separare la classe di accesso ai dati dall'helper del database, è meglio avere tutto il codice relativo al database in un unico posto.

L'utilizzo di classi di modello (solo), tuttavia, potrebbe non essere sempre pratico su Android, poiché supporta nativamente l'acquisizione e la visualizzazione di dati da un cursore (CursorAdapter e così via). Se vuoi usare una di queste cose, dovresti esporre i tuoi dati non come oggetti modello ma come Cursor. Per quanto riguarda i fornitori di contenuti, date un'occhiata anche a quelli, ma se non avete bisogno di esporre i vostri dati ad altre applicazioni, scrivere un ContentProvider potrebbe essere eccessivo.

In un'altra nota, non si desidera aprire e chiudere il database in ogni query. In realtà è sicuro di lasciarlo aperto, sarà automaticamente chiuso quando il processo della tua app muore.

0

nativa modellazione dei dati approccio di Android è contentproviders. Link

questo tipo di astrazione anche il tipo di origine dati.

mi sono abituato a farlo in un modo simile. ma di nuovo è anche soggettivo.

1

Lo faccio nella mia applicazione e funziona meravigliosamente, il codice è pulito e non ha alcun impatto sulle prestazioni, specialmente con i telefoni hardware oggi. Ho provato tutti gli altri approcci e ho persino utilizzato un fornitore di contenuti, ma a mio parere è solo una questione complicata.

Problemi correlati