2013-04-12 50 views
3

我做了兩個類,擴展Activity的主類和保存數據庫及其方法的Database類。下面顯示了數據庫類的部分代碼。如何創建數據庫一次,然後多次讀寫它,SQLite,OpenHelper,Android

SQLiteOpenHelper類是數據庫類中的嵌套類。我從我在互聯網上找到的一個例子中獲得了它。這個嵌套類的內部是方法,

db.execSQL(SCRIPT_CREATE_DATABASE); 

如何創建一個新的數據庫?如果我從主類實例化數據庫類是這樣的:

Database db = new Database(this); 

這是否實例自動實例嵌套SQLiteOpenHelper類呢?所以我不必明確地做到這一點。

但是對於如何創建數據庫的這個例子,我很困惑。如果每次我實例化一個新的實例調用這樣的addNewRow()方法:

public void addNewRow(String label, int price){ 
    Database db = new Database(context); 
    db.openToWrite(); 
    db.insertNewRow(checkBoxStatus, label, price); 
    db.close(); 
} 

則在「新數據庫(上下文)」調用創建一個新的數據庫,接下來我添加了信息進入列。最後調用db.close(),但每次我調用上面顯示的addNewRow方法時,它都會實例化一個新數據庫,並且還會實例化SQLiteOpenhelper類,以便創建一個新數據庫。這意味着最後一個數據庫已被覆蓋,並且我添加的最後一行已丟失,這是正確的嗎?

我該如何使用這個數據庫類來創建一個數據庫只有一次,然後用這樣的多個調用從它讀取和寫入東西?

Database db = new Database(context); 
    db.openToWrite(); or db.openToRead(); 
// read or update or create new row in database 
db.close(); 

數據庫類:爲SQLiteOpenHelper類

public class Database { 

    public static final String MYDATABASE_NAME = "my_database"; 
    public static final String MYDATABASE_TABLE = "my_table"; 
    public static final int MYDATABASE_VERSION = 1; 
    public static final String KEY_CHECKBOX_STATUS = "check_box_status"; 
    public static final String KEY_CHECKBOX_LABEL = "check_box_label"; 
    public static final String KEY_PRICE = "price"; 

    //create table MY_DATABASE (ID integer primary key, Content text not null); 
    private static final String SCRIPT_CREATE_DATABASE = 
    "CREATE TABLE " + MYDATABASE_TABLE + " (" + "ID INTEGER PRIMARY KEY AUTOINCREMENT, " + 
    "KEY_CHECKBOX_STATUS INTEGER, " + "KEY_CHECKBOX_LABEL TEXT, " + " KEY_PRICE INTEGER" + ");"; 

    SQLiteDatabase sqLiteDatabase; 
    SQLiteHelper sqLiteHelper; 
    Context context; 

    public Database(Context c){ 
      context = c; 
     } 

     // after this all the rest of the methods for get and set of database values 

代碼,嵌套的數據庫類的內部:

public class SQLiteHelper extends SQLiteOpenHelper { 

      public SQLiteHelper(Context context, String name, 
      CursorFactory factory, int version) { 
      super(context, name, factory, version); 
      } 

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

      @Override 
      public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      // TODO Auto-generated method stub 

      } 

     } 

回答

4

是的,每當你實例化一個數據庫類時,SQLiteHelper都會被實例化。但是,只有在數據庫不存在的情況下,纔會調用SQLiteHelper onCreate。您可以通過向其中一個表添加新列來測試此操作,然後嘗試在此列中插入一個有值的行,然後您的應用程序將崩潰。錯誤將是「沒有這樣的列」。然後,您需要清除數據或更改數據庫的版本或卸載應用程序,以便重新創建更改表。

1
private static final String SCRIPT_CREATE_DATABASE = 
    "CREATE TABLE IF NOT EXISTS " + MYDATABASE_TABLE + " (" + "ID INTEGER PRIMARY KEY AUTOINCREMENT, " + 
    "KEY_CHECKBOX_STATUS INTEGER, " + "KEY_CHECKBOX_LABEL TEXT, " + " KEY_PRICE INTEGER" + ");"; 

使用此查詢而創建表。如果它不存在,它將創建表。每當你想只要打開你的數據庫

2

,你需要使用這樣的:

myDatabase = myOpenHelper.getWritableDatabase(); 

這不會創建一個新的數據庫。它只會返回您可以執行讀取/寫入操作的現有數據庫的實例。

請參考this以深入瞭解如何在Sqlite中創建數據庫。希望能幫助到你。

相關問題