【问题标题】:Using SQLiteOpenhelper inside another class - Does not call OnCreate()在另一个类中使用 SQLiteOpenhelper - 不调用 OnCreate()
【发布时间】:2014-05-03 06:52:20
【问题描述】:

AbstractDbAdapter 内部有一个类,它扩展了SQLiteOpenHelper。当我调用它时,它会调用默认构造函数但不会进入onCreate() 函数。我手动成功创建了数据库,所以我确信所有 SQL 查询。为什么不调用 onCreate ?跟类里面的类有关系吗??

public abstract class AbstractDbAdapter {
        public static DatabaseHelper mDbHelper = null;
    public static SQLiteDatabase mDb = null;

    private static int mReferenceCount = 0;
    public static class DatabaseHelper extends SQLiteOpenHelper {

        public DatabaseHelper(Context context) {
            super(context,DATABASE_TABLE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            try{
                mDb.execSQL(SCREATE_SOME_TABLE);
                    //"Database creation successful"
            }
            catch(Exception ex) {
                    //"Database creation failed"
            }

        // "Database creation successful"
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            mDb.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE_NAME);
            this.onCreate(mDb);
        }
    }

    /**
     * 
     * 
     * @return this
     * @throws SQLException
     * if the database could be neither opened or created
     */
    public AbstractDbAdapter open() throws SQLException {
        if( mReferenceCount == 0 ) {

            if( mDbHelper == null )
                mDbHelper = new DatabaseHelper(//getting main activity context);

            if( mDb == null || mDb.isOpen() == false )
                mDb = mDbHelper.getWritableDatabase();
        }
        mReferenceCount++;

        return this;
    }

【问题讨论】:

    标签: android database sqlite database-connection


    【解决方案1】:

    onCreate() 在你调用帮助器上的getWritableDatabase()getReadableDatabase() 并且数据库文件不存在时被调用。如果文件已经存在并且版本号是请求的版本号,则不会调用onCreate() 等回调。

    不管怎样,在onCreate() 中捕获异常也是一个坏主意。如果方法返回成功(不抛出),则框架认为数据库创建成功。

    【讨论】:

      【解决方案2】:

      在您的 onCreate() 和 onUpgrade() 中,您使用了错误的数据库引用。您应该使用这些方法接收的数据库引用作为它们的参数,在您的情况下是 db 但您使用的是错误的 mDb

      【讨论】:

        【解决方案3】:

        当你调用getWritableDatabase/getReadableDatabase时调用onCreate/onUpgrade

        【讨论】:

          猜你喜欢
          • 2011-06-28
          • 1970-01-01
          • 2013-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多