2011-07-22 108 views
45

我正在嘗試製作我的第一個Android應用程序。我注意到如果數據庫不存在,則不調用SQLiteOpenHelper.onCreate()方法來創建表。但是,onCreate()方法甚至認爲我嘗試調試都不起作用。Android SQLiteOpenHelper:爲什麼不調用onCreate()方法?

請看下面的代碼,並給我任何建議。任何幫助將不勝感激。

public class NameToPinyinActivity extends Activity { 

    DatabaseOpenHelper helper = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.nametopinyin); 

     Button searchButton = (Button) findViewById(R.id.search); 
     searchButton.setOnClickListener(new ButtonClickListener()); 

     helper = new DatabaseOpenHelper(NameToPinyinActivity.this); 
    } 

public class DatabaseOpenHelper extends SQLiteOpenHelper { 

    /** DB Name */ 
    private static final String DB_NAME = "pinyin"; 

    /** CREATE TABLE SQL */ 
    private static final String CREATE_TABLE_SQL = "CREATE TABLE UNICODE_PINYIN" 
      + "(ID INTEGER PRIMARY KEY AUTOINCREMENT, " 
      + "UNICODE TEXT NOT NULL, PINYIN TEXT NOT NULL)"; 

    public DatabaseOpenHelper(Context context) { 
     super(context, DB_NAME, null, 1); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.beginTransaction(); 
     try { 
      db.execSQL(CREATE_TABLE_SQL); 
      db.setTransactionSuccessful(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      db.endTransaction(); 
     } 
    } 
+0

您是否嘗試設置日誌語句並查看?什麼使你確定onCreate()被調用?如果你設置了斷點,在我的觀察中,他們不傾向於在DB助手中使用該方法。 – Suchi

回答

51

我也有過與SQLiteOpenHelper麻煩。什麼工作對我來說是存儲變量

SQLiteDatabase db; 

在SQLiteOpenHelper的子類的成員,並呼籲

db = getWritableDatabase(); 
在構造

回答這個問題還包括有用的信息:SQLiteOpenHelper failing to call onCreate?

我希望這有助於!

+0

是的!你是對的!我可以創建數據庫,並且您提到的參考資料非常有用。謝謝! – zono

+1

db = getWritableDatabase(); - 對我來說,它只會觸發onUpgrade,但不會觸發onCreate。任何提示? – kellogs

+7

這意味着數據庫已經創建。只有在數據庫不存在時纔會調用onCreate()。 –

20

在調用SQLiteOpenHelper類的方法getWritableDatabase()getReadableDatabase()之前,不會創建數據庫。

那樣簡單數據庫將在內存中創建當你真正需要這一點。:)

-1

您可以更改AUTOINCREMENT自動遞增

注意 SQLiteOpenHelper叫的onCreate當數據庫第一次被創建時。如果您使用onCreate方法創建表,則無法創建新的SQLite數據庫。你可以看到例如

@Override 
 
    public void onCreate(SQLiteDatabase db) { 
 
     String stringCreateTable = "CREATE TABLE "+"tblUser"+" (" + 
 
       "id TEXT PRIMARY KEY, " + 
 
       "name TEXT)"; 
 
     db.execSQL(stringCreateTable); 
 
    }

+5

「_您可以更改AUTOINCREMENT爲AUTO INCREMENT_」**不,你不能!! ** – Anup

+0

工作像一個魅力 –

0

我有一個類似的問題,但它不是OnCreate呼叫是問題。

在上面的示例代碼中,Kevin解釋說如果數據庫已經存在,則不會調用OnCreate。但是,如果像我一樣使用來自不同活動的多個表格,那麼儘管您可能已經創建了數據庫,但與此活動關聯的表格可能尚未創建。因此,當您嘗試將遊標數據設置在不存在的表上時,您將調用一個異常。

我的解決辦法是定義一個名爲CreateTable一個單獨的類,這是從OnCreate倍率,從構造的

db = getWritableDatabase();

1

我有同樣的問題..我該決議是添加所謂的後兩。db作爲數據庫名稱的擴展

2

我有一個類似的問題,其中onCreate沒有執行。也許這對任何人都有用,即使它變成了另一個問題。

我曾經在數據庫上工作過,而且之前已經創建了很久。所以現在在onCreate()中進行更改後,我希望能夠找到創建的新表。但SQLiteOpenHelper從未再次調用onCreate()。原因是,數據庫已經存在。我仍然使用與之前相同的設備,因此使用已有的(舊)數據庫。

但有希望。當系統看到具有該名稱的數據庫時,它也會檢查版本號是否正確。在這種情況下,我只是忘記了數據庫已經存在。我的解決方案只是更改版本號。所以onUpgrade()被稱爲爲onCreate()更改提供選項。

因此,選項是卸載完整的應用程序(並使用它的數據庫),或者在升級版本號(例如刪除)舊錶並再次調用onCreate()後再次調用onCreate。

在任何情況下,如果未調用onCreate(),則檢查兩次(如果數據庫存在)。否則,它不會再被調用。

相關問題