2011-01-07 81 views
1

我想創建數據庫和所有數據ONCE並在稍後需要時更新一些數據。在我閱讀的大多數教程中,他們使用兩個類:一個擴展SQLiteOpenHelper,另一個簡化操作數據。例如:Android sql創建數據庫一次

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(),也會「重置」所有數據。

回答

1

這很不清楚你想要什麼。要麼在創建數據庫時要運行一次命令,要麼希望更頻繁地運行命令。如果你只想在創建時運行它們,但是它們在創建。如果你想運行他們一些其他的時間,把它們放在別的地方。現在我不知道你想要做什麼或者問題是什麼。

+0

只是想創建一次數據庫。我想使用我創建的DataHelper類來簡化更新數據的工作。 – semajhan 2011-01-08 00:18:52

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()方法中添加的任何代碼。隨後控制數據庫更改(例如alter table,update table等)應該在onUpdate中處理。

希望這會有所幫助。

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

希望這可以幫助你。