2010-12-30 15 views
5

Tengo alguna clase (SomeClass.class). Quiero tener algunos métodos estáticos en él como getAllDatabaseItems, getTableItems, insertNewRecord y más.Base de datos de acceso en clase no activa

Si lo hago de esta manera

SQLiteDatabase db = openOrCreateDatabase(DATABASE_NAME, MODE_PRIVATE, null); 
  • necesito para extender Actividad (pero todavía no se puede utilizar en los métodos estáticos) o pasar un "db" variable en cada método único (de " actividad de llamada ") que es bastante voluminosa.

¿Cuál es la solución, de manera que pueda de alguna clase llamada SomeClass.getAllDatabaseItems()?

@ MobileDev123 Así que todavía necesidad de ampliar la actividad (debido al método openOrCreateDatabase)? Si tengo esta clase (que en realidad no es una actividad, no lo utilice de esa manera)

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);"); 
} 

Y luego llamaremos a partir de algunas de mis actividades como esta

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

I obtener un NullExceptionError en la línea 4 (Partner.class) - ¿por qué? Si uso una referencia estática en

MODE_PRIVATE => (Context.MODE_PRIVATE) 

nuevamente, no está funcionando.

@Falmarri mismo con la estática, si paso en "este" argumento (de alguna clase de persona que llama) y la recibo como un argumento Contexto en mi método estático todavía no se puede crear con éxito/abrir mi base de datos (ver líneas antes)

+0

@svbee En lo que a mi conocimiento dice que está teniendo al menos un servicio o actividad ... Se puede llamar a la clase directamente o en jerarquía de llamadas. . (es decir, 'activity -> A -> B-- ---> your Class') ... en este caso, debe pasar' context' a todas las clases. Si su clase tiene control de vista, puede obtener View.getContext(); – Prasham

+0

@svbee Mi comprensión dice que necesita un objeto de contexto en su clase, y así es como lo hago cuando tengo ese tipo de problemas. Puede haber mejores respuestas para eso, pero hasta entonces puedes usarlo ... funciona para mí. – Prasham

+0

Editado mi respuesta, eche un vistazo ... – Prasham

Respuesta

4

Debe haber una actividad o servicio que llame a su clase, lo que puede hacer es pasar this en el momento conveniente. (Prefiero pasarlo en constructor).

Al recibir la mano, utilice el contexto instantáneo.

por ejemplo De MyActivity clase puede llamar createDatabase(this) o new DataServices(this) pero en DataServices clase el tipo de argumento debe ser context en lugar de MyActivity.

Ahora tiene el parámetro de contexto y puede usarlo de la manera que desee incluyendo llamando al openOrCreateDatabase().

Editar: Añadiendo el código

de Main.java

escritura

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

En la clase de Base de Datos: no es necesario extender la actividad allí. En la definición de constructor

public DataBase(Context context); // Si usa eclipse y confía en algunas herramientas automáticas, puede ver algo como Main main. Pero use esta línea, para que pueda llamarla desde cualquier actividad o servicio pasando esto.

definen un campo de Clase de contexto, y lo refieren al contexto arg.

Como this.localContext= context;

Y mediante el uso de variables localContext puede llamar a la columna openOrCreateDataBase.

ADEMÁS: Si usted tiene ningún control (subclase de vista) unido a ello se puede crear una instancia de base de datos llamando new DataBase(view.getContext());

espero que esto le ayudará en caso de .... más ayuda necesaria dude para comentar a continuación.

+0

He editado mi pregunta, así que eche un vistazo;) – svenkapudija

+0

¿Podría proporcionarnos algún código de muestra? Todavía no lo estoy haciendo bien (obviamente):/Todavía obtengo el error Nulo. – svenkapudija

+0

¿por qué no? pero antes de esto, creo que necesito tu ayuda. 1. ¿Cuál es el nombre de clase que inicia su aplicación? ¿Es esto una actividad o servicio? 2. Necesito tu estructura de clase ... Desde el punto de partida de tu actividad hasta la clase. No olvide mencionar si algún control de vista invoca la clase en la que desea crear la base de datos. – Prasham

0

No estoy seguro de que sea posible hacerlo directamente. He luchado con esto por mí mismo, pero cada aplicación utiliza un identificador de base de datos diferente, por lo que Android necesita saber cómo agarrarlo (un Contexto) cuando obtener el identificador de ese oh tan conveniente:

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

Tal vez sea posible averigüe cómo funciona SQLOpenHelper y utilice una ruta de acceso codificada a la base de datos. Probablemente hay un montón de cosas útiles que SQLOpenHelper hace por ti, pero te darías por vencido. Me imagino que probablemente sea clave para ser un dispositivo cruzado.

+0

'Tal vez pueda averiguar cómo ir alrededor de SQLOpenHelper y utilizar una ruta de acceso codificada a la base de datos' No. – Falmarri

+0

Heh. Fue una posibilidad remota. – SapphireSun

0

Necesita un contexto. Si desea hacer esto en un método estático, debe tener en contexto

+0

editado mi pregunta. – svenkapudija

0

No necesita un contexto. Uso SQLiteDatabase métodos estáticos:

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) 

Cuestiones relacionadas