2011-02-17 3 views
26

Я пытаюсь создать локальную базу данных на телефоне Android, используя sqlite.SQLiteOpenHelper не может вызвать onCreate?

У меня есть вспомогательный класс, показанный ниже, который используется для создания базы данных и предоставления «помощи».

Я хочу создать объект этого класса в основной части моего кода и создать там базу данных и таблицы.

Проблема:

Всякий раз, когда я создать объект класса, он не кажется, вызывая метод onCreate в помощнике. Я думал, это должно произойти. Я думал, что onCreate был в основном конструктором для класса. (Я считаю, что я ошибаюсь)

  • Так почему же это не вызов метода onCreate?
  • Или как я могу получить его для создания базы данных и таблиц, где я создаю объект класса?
  • Что было бы лучшим способом сделать это, если это не хороший подход?

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

ответ

62

onCreate не является конструктором для класса базы данных. Он вызывается только при попытке открыть базу данных, которая не существует. Чтобы открыть/создать базу данных, которую нужно добавить вызов к одному из следующих методов:

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

Это немного большой, но вот мой DatabaseAdapter вы посмотрите на может: http://saintfeintcity.org/projects/sfc/repository/entry/trunk/src/org/saintfeintcity/database/GameDbAdapter.java

+0

Прохладный, спасибо. Если я хочу иметь класс, такой как ваш, который содержит все мои вещи обработки sql. Как получить доступ к объекту этого класса во всех моих других классах? Например, я создаю объект в своем основном классе. Теперь я хочу использовать методы insert в классе, который был создан в моем основном классе. Как получить доступ к исходному объекту db, который был создан в основном классе в другом классе? – prolink007

+0

На самом деле, я просто создаю новый объект внутри каждого класса, которому нужен databaseHelper? Я считаю, что это то, что я должен делать, я могу задать это как вопрос, если никто не ответит. Спасибо – prolink007

+0

im сталкиваются с проблемой здесь ..02-17 10: 12: 53.441: ERROR/Database (311): close() никогда не вызывалось явным образом в базе данных '/data/data/com.ey.eyconnect/databases/test. db '02-17 10: 12: 53.441: ERROR/Database (311): android.database.sqlite.DatabaseObjectNotClosedException: приложение не закрыло курсор или объект базы данных, который был открыт здесь. Исключение выбрано здесь .. как решить эту проблему. .. – jennifer

14

Вы должны вызвать getWritableDatabase() или getReadableDatabase().

+0

-тестирования, Я считаю, что ты прав. Я просто проверил примеры Android и нашел это. Должно быть, я уже смотрел его, дам вам знать, как это происходит. Спасибо – prolink007

+0

+1: это сработало. Спасибо – prolink007

+0

Мне пришлось поднять версию db, чтобы сделать oncreate run ... –

Смежные вопросы