没有调用SQLiteOpenHelper“onCreate”? (数据库不存在)

时间:2012-04-13 20:29:00

标签: android sqlite sqliteopenhelper

从片段中我以这种方式实例化

fmdata = new FileManagerData(getActivity());

以下课程。我不明白为什么没有调用onCreate()并且我的数据库没有被创建。

public class FileManagerData {
public static final String TAG = FileManagerData.class.getSimpleName();;


Context context;
DBHelper dbHelper;

public FileManagerData (Context context){
    this.context = context;
    dbHelper = new DBHelper();
}

private class DBHelper extends SQLiteOpenHelper{

    private static final String DB_NAME = "filename.db";
    private static final String DB_SQL = "filename.sql";
    private static final int DB_VERSION = 1; // internal number

    public DBHelper() {
        super(context, DB_NAME, null, DB_VERSION);  
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
            // this is NEVER called and my DB does not exist yet
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }   
}

编辑 :诀窍是必须使用数据库(读取或写入),以便调用onCreate()。

5 个答案:

答案 0 :(得分:11)

首次访问数据库后,将调用onCreate方法。对数据库进行查询,将调用onCreate

答案 1 :(得分:3)

可能数据库存在于较早的尝试中。

卸载您的应用并重试。

答案 2 :(得分:0)

你应该投入创造这个:

sqLiteDatabase.execSQL("create table" + DB_NAME + " ( _id integer primary key autoincrement, " + fieldOne + "INTEGER, " + fieldTwo + "INTEGER);");

其中fieldOne和fieldTwo是表格列的名称。另见: http://www.sqlite.org/datatype3.html

答案 3 :(得分:0)

我知道这个帖子已经接受了答案。毫无疑问,这是我必须补充的:

我有:

    protected class OpenHelper extends SQLiteOpenHelper {

    @Override
    public void onCreate(SQLiteDatabase db) {
        try {
             MHSqlDb.this.createTables(db);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

我在说这个:

    iOpenHelper = new OpenHelper(iDbFileName, DATABASE_VERSION );

此阶段不存在databese文件。

然后我做了一些app的调试。 我从不打电话

    iOpenHelper.getReadableDatabase();

我都不打电话

    iOpenHelper.getWritableDatabase();

数据库文件仍然不存在。现在,当我从调试器中删除应用程序时,我可以突然看到创建了数据库文件(名称在iDbFileName中)。从不调用OpenHelper的onCreate方法。

因此,虽然我同意onCreate方法的意图似乎是在数据库文件不存在时被调用,并且调用了getReadableDatabase()或getWritableDatabase(),但显然情况并非如此。

答案 4 :(得分:0)

卸载应用程序将删除数据库,因此将在下次运行时调用onCreate。