4

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

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() 被调用。

4

5 回答 5

11

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

于 2012-04-13T21:24:32.937 回答
3

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

卸载您的应用,然后重试。

于 2012-04-13T20:31:52.277 回答
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 );

数据库文件在这个阶段不存在。

然后我对应用程序进行一些调试。我从不打电话

    iOpenHelper.getReadableDatabase();

我也不打电话

    iOpenHelper.getWritableDatabase();

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

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

于 2013-03-28T23:54:01.343 回答
0

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

于 2013-07-01T21:32:16.037 回答
0

你应该把 onCreate 这个:

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

其中 fieldOne 和 fieldTwo 是表列的名称。也看这里: http ://www.sqlite.org/datatype3.html

于 2012-04-13T21:11:16.740 回答