Android sql создает базу данных один раз - PullRequest
1 голос
/ 08 января 2011

Я хочу создать базу данных и все данные ОДИН РАЗ и обновить некоторые данные, возможно, позже, когда это необходимо.В большинстве прочитанных мною учебников они используют два класса: один расширяет 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 () для создания и добавления данныхв базу данных.Но каждый раз, когда приложение запускается, оно «сбрасывает» все данные, даже если бы я вызывал updateEvent ().

Ответы [ 3 ]

3 голосов
/ 08 января 2011

Вы можете использовать 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 ().Для последующего управления изменениями в БД (например, изменение таблицы, обновление таблицы и т. Д.) Следует обращаться в onUpdate.

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

1 голос
/ 08 января 2011

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

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

1 голос
/ 08 января 2011

Довольно неясно, что вы хотите.Либо вы хотите запускать команды один раз при создании БД, либо хотите запускать чаще.Если вы хотите запускать их только при создании, но при их создании.Если вы хотите запустить их несколько раз, поместите их в другое место.Сейчас я понятия не имею, что вы пытаетесь сделать или в чем проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...