2017-07-17 77 views
1

即使在卸載應用程序並重新安裝之後,也不會調用onCreate方法。不調用SQLiteOpenHelper onCreate方法

Database.java:

public class Database extends SQLiteOpenHelper { 
    public static SQLiteDatabase db; 
    public Database(Context context) { 
     super(context,"db", null, 1); 
     Log.i("DB", "dbManager"); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     Log.i("DB", "dbOnCreate"); 
     String s = "CREATE TABLE test(id INTEGER);"; 
     db.execSQL(s); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { 
     Log.i("DB", "dbOnUpgrade"); 
    } 
} 

我把這種:

Database db = new Database(this); 

輸出:

十二月7日至17日:42:03.053 16448-16448/COM。 package.app I/DB:dbManager

這是什麼問題,以及如何解決它?

+0

我投repoen這一點,因爲它沒有任何關係與@CL提出的問題! –

+0

是的,它已閱讀接受的答案。 – Selvin

+0

@Selvin它被標記爲重複,甚至不知道OP是否調用getReadableDatabase或getWritetableDatabase。 OP沒有顯示他所有的代碼...所以,怎麼能知道它? –

回答

5
public class Database extends SQLiteOpenHelper { 
    public static SQLiteDatabase db; 
    public Database(Context context) { 
     super(context,"db", null, 1); 
     getReadableDatabase(); // <-- add this, which triggers onCreate/onUpdate 
     Log.i("DB", "dbManager"); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     Log.i("DB", "dbOnCreate"); 
     // ... 
    } 
    // ... 
} 

說明: 如果DB是用於寫入或讀取訪問的更新時纔會觸發。既然你不這樣做,onCreate永遠不會被調用。

通常,您只需在某處調用Database類的方法(例如查詢實體),那就是調用onCreate /(或onUpdate)的時刻。

因爲,您沒有這樣的方法(現在),只需在Database構造函數中調用它即可。

或者:

或者,也許更清潔是創建數據庫對象後,有權要求getReadableDatabase()

Database db = new Database(this); 
db.getReadableDatabase(); 
1
@Override 
public void onCreate(SQLiteDatabase db) { 
    // ... 
} 

onCreate首次創建數據庫時調用。這是 創建表的位置,並且表的初始人口應該發生 。

String s = "CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY);"; 

卸載應用嘗試,並再次運行。然後檢查

+1

這是重新安裝後甚至第一次運行在虛擬設備上的結果! –

+0

在/data/data/com.package.app中,數據庫文件夾不存在,所以數據庫從未創建! –

+0

@MohammadBahadori add'getReadableDatabase()' –

0

必須調用getReadableDatabase()或getWritableDatabase()方法爲你的數據庫類。 如果你想要寫/更新的數據到數據庫中使用getWritableDatabase(),如果你想從數據庫使用getReadableDatabase()

Database dbHelper = new Database(this); 
SQLiteDatabase db = dbHelper.getReadableDatabase(); 
SQLiteDatabase db = dbHelper.getWritableDatabase(); 

獲取數據,然後使用適當的方法扭動,漸漸,更新,或在你的數據庫中刪除數據。 例如:

db.query("table_name", null, null, null, null, null, null); 
+0

我可以在類構造函數中獲取getWritableDatabase嗎?或者必須在MainActivity中調用? –

相關問題