2010-12-30 15 views
5

Ho una classe (SomeClass.class). Voglio avere alcuni metodi statici come getAllDatabaseItems, getTableItems, insertNewRecord e così via.Accesso al database nella classe di non attività

Se lo faccio in questo modo

SQLiteDatabase db = openOrCreateDatabase(DATABASE_NAME, MODE_PRIVATE, null); 
  • ho bisogno di estendere attività (ma ancora non è possibile utilizzarlo in metodi statici) oppure passare un "db" variabile in ogni singolo metodo (da " attività chiamante ") che è piuttosto ingombrante.

Qual è la soluzione in modo che posso da alcuni chiamano classe SomeClass.getAllDatabaseItems()?

@ MobileDev123 Così ho ancora bisogno di estendere attività (a causa del metodo openOrCreateDatabase)? Se ho questa classe (che in realtà non è un'attività, non utilizzare in questo modo)

public class Partner extends Activity { 
@SuppressWarnings("static-access") 
public Partner(Context mContext) { 
    myContext = mContext; 
    db = openOrCreateDatabase(DATABASE_NAME, myContext.MODE_PRIVATE, null); 

    db.execSQL("CREATE TABLE IF NOT EXISTS " + PARTNER_TABLE_NAME + " (id INTEGER PRIMARY KEY AUTOINCREMENT, " + NAME + " VARCHAR);"); 
    db.execSQL("CREATE TABLE IF NOT EXISTS " + ADDRESS_TABLE_NAME + " (id INTEGER PRIMARY KEY AUTOINCREMENT, " + PARTNER_ID + " INT, " + ADDRESS + " VARCHAR, " + CITY + " VARCHAR);"); 
} 

E poi chiamare da alcuni dei miei attività come questo

Partner newPartner = new Partner(this); 
    partnersItems = newPartner.getAllItems(); 

I ottieni un NullExceptionError sulla linea 4 (Partner.class) - perché? Se utilizzo il riferimento statico su

MODE_PRIVATE => (Context.MODE_PRIVATE) 

di nuovo non funziona.

@Falmarri stesso con statico, se passo l'argomento "questo" (da qualche classe chiamante) e lo ricevo come argomento di contesto nel mio metodo statico non riesco ancora a creare/aprire il mio database (vedere le righe prima)

+0

@svbee Per quanto riguarda la mia conoscenza dice che stanno avendo atleast un servizio o attività ... Si può chiamare direttamente o in gerarchia di richiamo la vostra classe. . (cioè 'attività -> A -> B-- ---> la tua classe') ... in questo caso devi passare' context' a tutte le classi. Se la tua classe ha un controllo di visualizzazione, puoi ottenere View.getContext(); – Prasham

+0

@svbee la mia comprensione dice che hai bisogno di un oggetto di contesto nella tua classe, e questo è come faccio quando ho questo tipo di problemi. Forse ci sono risposte migliori per questo, ma fino ad allora puoi usarlo ... funziona per me. – Prasham

+0

Modificato la mia risposta, dai uno sguardo ... – Prasham

risposta

4

Ci deve essere un'attività o un servizio che chiama la tua classe, quello che puoi fare è passare this a tuo piacimento. (Preferisco passarlo in costruttore).

Sulla mano ricevente utilizzare l'istante di contesto.

es Da MyActivity classe è possibile chiamare o createDatabase(this)new DataServices(this) ma in DataServices classe del tipo di argomento deve essere context invece di MyActivity.

Ora hai il parametro di contesto e puoi usarlo nel modo che preferisci includendo lo openOrCreateDatabase().

Edit: Aggiunta del codice di

da Main.java

scrittura

DataBase database = new DataBase(this); //This will pass an instance of main. Which is eventually the subclass of Context.java 

In classe DataBase: non è necessario estendere l'attività lì. In constructor defination

// Se si utilizza Eclipse e si basa su alcuni strumenti automatici, è possibile vedere qualcosa come Main main. Ma usa questa linea, così puoi chiamarla da qualsiasi attività o servizio passando questo.

definire un campo della classe Contesto e riferirlo all'argomento di contesto.

Come this.localContext= context;

E utilizzando variabile localContext è possibile chiamare colonna openOrCreateDataBase.

AGGIUNTA: Se si dispone di alcun controllo (sottoclasse di vista) allegato al presente è possibile creare un'istanza database chiamando new DataBase(view.getContext());

Spero che questo vi aiuterà .... nel caso in cui più aveva bisogno di aiuto non esitate per commentare qui sotto.

+0

Ho modificato la mia domanda quindi, per favore, date un'occhiata;) – svenkapudija

+0

Potete fornire qualche codice di esempio? Non riesco ancora a farlo bene (ovviamente):/Ancora ricevendo errore Null. – svenkapudija

+0

perché no? ma prima di questo penso di aver bisogno del tuo aiuto. 1. Qual è il nome della classe che avvia la tua applicazione. Questa è un'attività o servizio? 2. Ho bisogno della tua struttura di classe ... Dal punto di partenza della tua attività alla classe. Non dimenticare di menzionare se qualsiasi controllo di visualizzazione richiama la classe in cui desideri creare il database. – Prasham

0

Non sono sicuro che sia possibile farlo direttamente. Ho lottato con questo me stesso, ma ogni applicazione utilizza un diverso maniglia database, quindi Android ha bisogno di sapere come afferrarlo (un Context) quando si ottiene la maniglia da quel oh così conveniente:

SQLiteDatabase db = (SQLiteDatabase)(new SQLOpenHelperDerivedClass(this)).getReadableDatabase(); 

forse si può capire come aggirare SQLOpenHelper e utilizzare un percorso hardcoded al database. Probabilmente c'è un sacco di roba utile che SQLOpenHelper fa per te che ti arrenderesti comunque. Immagino che sia probabilmente la chiave per essere cross device.

+0

'Forse puoi capire come aggirare SQLOpenHelper e usare un percorso hardcoded al database. No. – Falmarri

+0

Heh. Era un colpo lungo. – SapphireSun

0

È necessario un contesto. Se vuoi farlo in un metodo statico, devi prendere in un contesto

+0

modificato la mia domanda. – svenkapudija

0

Non è necessario un contesto. Usa SQLiteDatabase metodi statici:

public static SQLiteDatabase openOrCreateDatabase (String path, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler) 
public static SQLiteDatabase openOrCreateDatabase (String path, SQLiteDatabase.CursorFactory factory) 
public static SQLiteDatabase openOrCreateDatabase (File file, SQLiteDatabase.CursorFactory factory)

o:


public static SQLiteDatabase openDatabase(String path, SQLiteDatabase.CursorFactory factory, int flags, DatabaseErrorHandler errorHandler) 
public static SQLiteDatabase openDatabase(String path, SQLiteDatabase.CursorFactory factory, int flags) 

Problemi correlati