2011-02-17 11 views
26

Sto provando a creare un database locale su un telefono Android utilizzando sqlite.SQLiteOpenHelper non riesce a chiamare suCreare?

Ho una classe di supporto, illustrata di seguito, che viene utilizzata per creare il database e fornire la "guida".

Sto cercando di creare un oggetto di questa classe nella parte principale del mio codice e crea anche il database e le tabelle.

Il problema:

Ogni volta che creo un oggetto della classe, non sembra essere di chiamare il metodo onCreate nel aiutante. Pensavo che questo dovesse succedere. Pensavo che lo onCreate fosse fondamentalmente un costruttore per la classe. (Credo di aver sbagliato)

  • Quindi, perché non chiama il metodo onCreate?
  • O come faccio a creare il database e le tabelle in cui sto creando l'oggetto della classe?
  • Quale sarebbe un modo migliore per farlo, se questo non è un buon approccio?

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

risposta

62

Il onCreate non è un costruttore per la classe del database. Viene chiamato solo se si tenta di aprire un database che non esiste. Per aprire/creare il database è necessario aggiungere una chiamata a uno di questi metodi:

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

E 'un po' grande, ma qui è la mia DatabaseAdapter è possibile dare un'occhiata a: http://saintfeintcity.org/projects/sfc/repository/entry/trunk/src/org/saintfeintcity/database/GameDbAdapter.java

+0

Cool, grazie. Se voglio avere una classe, come la tua, che contiene tutte le mie cose di gestione di SQL. Come posso accedere all'oggetto di quella classe in tutte le mie altre classi? Ad esempio, creo l'oggetto nella mia classe principale. Ora voglio usare i metodi di inserimento in una classe che è stata creata nella mia classe principale. Come posso accedere all'oggetto db originale che è stato creato nella classe principale in un'altra classe? – prolink007

+0

In realtà, devo solo creare un nuovo oggetto all'interno di ogni classe che necessita di databaseHelper? Credo che questo sia quello che dovrei fare, potrei chiedere a questo come una domanda se nessuno risponde. Grazie – prolink007

+0

mi trovo ad affrontare un problema qui ..02-17 10: 12: 53.441: ERRORE/Database (311): close() non è mai stato chiamato esplicitamente sul database '/data/data/com.ey.eyconnect/databases/test. db '02-17 10: 12: 53.441: ERRORE/Database (311): android.database.sqlite.DatabaseObjectNotClosedException: L'applicazione non ha chiuso il cursore o l'oggetto del database che è stato aperto qui viene lanciata l'eccezione qui..come risolvere questo. .. – jennifer

14

devi chiamare getWritableDatabase() o getReadableDatabase().

+0

test ora, Credo che tu abbia ragione. Ho appena controllato gli esempi di Android e l'ho trovato. Devo averlo finito a guardarlo, ti farò sapere come va. Grazie – prolink007

+0

+1: questo ha funzionato. Grazie – prolink007

+0

ho dovuto anche aumentare la versione di db per fare funzionare oncreate ... –

Problemi correlati