Android sql создает базу данных один раз

1

Я хочу создать базу данных и все данные ONCE и обновить некоторые данные, возможно, позже, когда это потребуется. На протяжении большинства обучающих программ, которые я прочитал, они используют два класса: один, который расширяет SQLiteOpenHelper и другой, чтобы упростить манипулирование данными. Например:

public class EventsData extends SQLiteOpenHelper {

private static final String DATABASE_NAME = "events.db";
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_CREATE = "CREATE TABLE " + TABLE_NAME + "(" + ID + " INT, " + TITLE + " TEXT, " + UNLOCK + " INT)";
private static final String DATABASE_UPGRADE = "DROP TABLE IF EXISTS " + TABLE_NAME;

public EventsData(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    db.execSQL(DATABASE_CREATE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub
    db.execSQL(DATABASE_UPGRADE);
    onCreate(db);
}

}

public class DataHelper {

private static final String[] FROM = {ID, TITLE, UNLOCK};
//private static final String ORDER_BY = UNLOCK + " DESC";

private Context context;
private SQLiteDatabase db;
private EventsData eventsData;

public DataHelper(Context context) {
    this.context = context;
    eventsData = new EventsData(this.context);
}

public void addEvent(int id, String name, int unlocked) {
    db = eventsData.getWritableDatabase();
    ContentValues cv = new ContentValues();
    cv.put(ID, id);
    cv.put(TITLE, name);
    cv.put(UNLOCK, unlocked);
    db.insertOrThrow(TABLE_NAME, null, cv);
}

public void updateEvent(int id, String name, int unlocked) {
    db = eventsData.getWritableDatabase();
    ContentValues cv = new ContentValues();
    cv.put(ID, id);
    cv.put(TITLE, name);
    cv.put(UNLOCK, unlocked);
    db.update(TABLE_NAME, cv, ID + "=" + id, null);
}

public Cursor getEvent() {
    db = eventsData.getReadableDatabase();
    Cursor cursor = db.query(TABLE_NAME, FROM, null, null, null, null, null);
    return cursor;
}

public StringBuilder showEvent(Cursor cursor) {
    StringBuilder sb = new StringBuilder();
    while (cursor.moveToNext()) {
        String id = cursor.getString(0);
        String title = cursor.getString(1);
        String unlock = cursor.getString(2);
        sb.append(id).append(": ");
        sb.append(unlock).append(": ");
        sb.append(title).append("\n");
    }
    return sb;
}

public void deleteAll() {
    db = eventsData.getWritableDatabase();
    db.delete(TABLE_NAME, null, null);
}

}

В моем основном действии я создаю экземпляр DataHelper и вызываю addEvent() для создания и добавления данных в базу данных. Но каждый раз, когда приложение запускается, оно будет "reset" всех данных, даже если я должен был вызвать updateEvent().

Теги:
database

3 ответа

1
Лучший ответ

Это довольно неясно, чего вы хотите. Либо вы хотите запускать команды один раз, когда создается db, либо вы хотите запускать более часто. Если вы хотите запускать их только при создании, но их в oncreate. Если вы хотите запустить их некоторое количество раз, поместите их в другое место. Прямо сейчас я понятия не имею, что вы пытаетесь сделать или что проблема.

  • 0
    Просто хотел создать базу данных один раз. Я хотел использовать созданный мной класс DataHelper, чтобы упростить процесс обновления данных.
  • 0
    Метод onCreate вашего databaseHelper должен вызываться, только если база данных не создана. Так что не понятно в чем твоя проблема.
3

Вы можете использовать DBVersion для управления этим поведением.

Если вы расширяете SQLiteOpenHelper, вы можете передать DBVersion в конструкторе. фрагмента кода следующим образом.

private static final int DATABASE_VERSION = 1;
public MyDBHelper(Context context) {
    super(context, DB_NAME, null, DATABASE_VERSION);
}

См. версию атрибута doco http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#SQLiteOpenHelper%28android.content.Context,%20java.lang.String,%20android.database.sqlite.SQLiteDatabase.CursorFactory,%20int%29

Любой метод, который должен выполняться в первый раз (только), должен быть добавлен в метод onCreate(). Для последующего контроля изменений db (например, таблица изменения, таблица обновлений и т.д.) Необходимо обрабатывать inUpdate.

Надеюсь, это поможет.

1

Есть две функции, которые вы можете переопределить в SQLiteOpenHelper, которые являются onCreate() и onUpgrade(). onCreate() вызывается, если база данных и таблицы не существуют на устройстве, а затем создает файл для вас. onUpgrade() вызывается, если вы передаете другой номер версии помощнику в конструкторе. Это полезно, если вам нужно сделать жизненно важные изменения в своей базе данных на устройстве только один раз.

private class DatabaseOpenHelper extends SQLiteOpenHelper {

                        public DatabaseOpenHelper(Context context, String name, int version) {
                            super(context, name, null, version);
                        }            

                        @Override
                        public void onCreate(SQLiteDatabase db) {
                            try {
                                //Create tables here
                                db.execSQL("CREATE TABLE " + table_name + args);
                            } catch(SQLException e) {
                                //Database error
                            }
                        }

                        @Override
                        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                            //This will be called if your database version ever changes
                            this.onCreate(db);
                        }
}

Надеюсь, это поможет вам.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню