2011-02-17 27 views
26

Estoy tratando de crear una base de datos local en un teléfono Android usando sqlite.SQLiteOpenHelper no puede llamar a Crear?

Tengo una clase auxiliar, que se muestra a continuación, que se utiliza para crear la base de datos y proporcionar la "ayuda".

Quiero crear un objeto de esta clase en la parte principal de mi código y crear la base de datos y las tablas allí también.

El problema:

Siempre que puedo crear un objeto de la clase, no parece ser una llamada al método onCreate en el ayudante. Pensé que esto debería suceder. Pensé que onCreate era básicamente un constructor para la clase. (Creo que estoy equivocado)

  • Entonces, ¿por qué no está llamando al método onCreate?
  • ¿Cómo lo hago para crear la base de datos y las tablas donde estoy creando el objeto de la clase?
  • ¿Cuál sería una mejor manera de hacer esto, si este no es un buen enfoque?

public class SmartDBHelper extends SQLiteOpenHelper { 

    private static final String DATABASE_NAME = "smart_lite_db.db"; 
    private static final int DATABASE_VERSION = 2; 
    private static final String NOTIFY_TABLE_NAME = "user_notify_data"; 
    private static final String HR_TABLE_NAME = "user_hr_data"; 
    private static final String NOTIFY_TABLE_CREATE = 
     "CREATE TABLE " + NOTIFY_TABLE_NAME + 
     " (counter INTEGER PRIMARY KEY, " + 
     "userresponse INTEGER, " + 
     "notifytime INTEGER);"; 
    private static final String DATA_TABLE_CREATE = 
     "CREATE TABLE " + HR_TABLE_NAME + 
     " (counter INTEGER PRIMARY KEY, " + 
     "hr INTEGER, " + 
     "act INTEGER, " + 
     "timestamp INTEGER);";  

    public SmartDBHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     // TODO Auto-generated constructor stub 
    } 


    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 
     Log.v("smartdbhelper", "before creation"); 
     db.execSQL(NOTIFY_TABLE_CREATE); 
     Log.v("smartdbhelper", "middle creation"); 
     db.execSQL(DATA_TABLE_CREATE); 
     Log.v("smartdbhelper", "after creation"); 
    } 


    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 

    } 

} 

public class SmartApp extends Activity implements OnSharedPreferenceChangeListener { 
    private SmartDBHelper dBHelper; 
    public void onCreate(Bundle savedInstanceState) { 
     //where i am wanting to create the database and tables 
     dBHelper = new SmartDBHelper(getContext()); 
    } 
} 

Respuesta

62

El onCreate no es un constructor para la clase de base de datos. Solo se llama si intenta abrir una base de datos que no existe. Para abrir/crear la base de datos es necesario agregar una llamada a uno de estos métodos:

public class SmartApp extends Activity implements OnSharedPreferenceChangeListener { 
    private SmartDBHelper dBHelper; 
    public void onCreate(Bundle savedInstanceState) { 
     //where i am wanting to create the database and tables 
     dBHelper = new SmartDBHelper(getContext()); 
     // open to read and write 
     dBHelper.getWritableDatabase(); 
     // or to read only 
     // dBHelper.getReadableDatabase(); 
    } 
} 

Es un poco grande, pero aquí está mi DatabaseAdapter se puede echar un vistazo a: http://saintfeintcity.org/projects/sfc/repository/entry/trunk/src/org/saintfeintcity/database/GameDbAdapter.java

+0

Cool, gracias. Si quiero tener una clase, como la tuya, eso contiene todos mis conocimientos de SQL Server. ¿Cómo obtengo acceso al objeto de esa clase en todas mis otras clases? Por ejemplo, creo el objeto en mi clase principal. Ahora quiero usar los métodos de inserción en una clase que fue creada en mi clase principal. ¿Cómo accedo al objeto db original que se creó en la clase principal en otra clase? – prolink007

+0

En realidad, ¿acabo de crear un nuevo objeto dentro de cada clase que necesita el databaseHelper? Creo que esto es lo que se supone que debo hacer, puedo preguntar esto como una pregunta si nadie responde. Gracias – prolink007

+0

Estoy enfrentando un problema aquí ..02-17 10: 12: 53.441: ERROR/Base de datos (311): close() nunca fue llamado explícitamente en la base de datos '/data/data/com.ey.eyconnect/databases/test. db '02-17 10: 12: 53.441: ERROR/Base de datos (311): android.database.sqlite.DatabaseObjectNotClosedException: la aplicación no cerró el cursor ni el objeto de la base de datos que se abrió aquí. Se arroja una excepción aquí ... cómo resolver esto. .. – jennifer

14

usted tiene que llamar o getWritableDatabase()getReadableDatabase().

+0

prueba ahora, creo que tienes razón Acabo de comprobar los ejemplos de Android y encontré eso. Debo haberlo estado buscando, te dejaré saber cómo va. Gracias – prolink007

+0

+1: esto funcionó. Gracias – prolink007

+0

tuve que elevar la versión db también para hacer que la ejecución de oncreate ... –

Cuestiones relacionadas