Android開發錯誤集(二)

28: Caused by: java.lang.ClassCastException: com.xiyili.youjia.ui.start.StartGaFragment cannot be cast to android.app.Fragmentjava

在使用Support Library庫中的Fragment中時,若是使用是否是FragmentActivity的話就會報上面的錯.改用FragmentActivity就OK了.android


27: 在使用AppCompat的PopupMenu時出現了以下的錯誤:    java.lang.RuntimeException: Binary XML file line #17: You must supply a layout_height attribute.sql

這是由於PopupMenu是以PopupWindow來顯示的,全部須要使用Activity的Context數據庫

26:     Caused by: java.lang.IllegalArgumentException: Can only use lower 16 bits for requestCodeapp

     startActivityForResult參數的requestCode不能太大了,因此不能超過2的16次方ide

25:  <item> tag requires a 'drawable' attribute or child tag defining a drawable
     出現這個錯誤,若是你找了好久也找不到錯誤的緣由,那麼可能就是下面的這一種.緣由是在於:
ui

                        W  Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #4: <item> tag requires a 'drawable' attribute or chil
                           d tag defining a drawable
                        W      at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:178)
                        W      at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:921)
                        W      at android.graphics.drawable.Drawable.createFromXml(Drawable.java:858)
                        W      at android.content.res.Resources.loadDrawable(Resources.java:1946)
                        W      ... 36 more



能夠看出來雖然咱們的color/下的selector是color的selector可是其實也是StateListDrawable來實現的,因此,不能直接在上面寫顏色值而是要引用顏色值spa



最後更新 2014-02-26code

24 Can't upgrade read-only database from version 8 to 9orm

出現這個錯誤的時候是在getReadableDatabase()調用的時候:

錯誤拋出的地方在:android.database.sqlite.SQLiteOpenHelper.java:57#getDatabaseLocked

個人第一感受就是,啊,這個的bug太容易出現了:

除非我重寫getReadableDatabase,

好比我升級了數據庫,在onUpgrade中有一些修改數據庫結果的語句,

可是升級以後第一次進行數據庫調用的是getReadableDatabase,這個時候,就會報不能從只讀的數據庫更新的異常了.

咱們來看下Android數據庫更新的事件代碼:

            final int version = db.getVersion();
            if (version != mNewVersion) {
                if (db.isReadOnly()) {
                    throw new SQLiteException("Can't upgrade read-only database from version " +
                            db.getVersion() + " to " + mNewVersion + ": " + mName);
                }

                db.beginTransaction();
                try {
                    if (version == 0) {
                        onCreate(db);
                    } else {
                        if (version > mNewVersion) {
                            onDowngrade(db, version, mNewVersion);
                        } else {
                            onUpgrade(db, version, mNewVersion);
                        }
                    }
                    db.setVersion(mNewVersion);
                    db.setTransactionSuccessful();
                } finally {
                    db.endTransaction();
                }
            }



因此我想出來的解決辦法就是,若是在調用getReadableDatabase時,檢查下異常,若是有異常的話返回Writable版本的Database,這樣作有什麼很差的地方呢?

    @Override
    public SQLiteDatabase getReadableDatabase() {
        try {
            return getReadableDatabase();
        } catch (SQLiteException e) {
            YoujiaLog.warn(e,e.getMessage(),"getReadableDatabase error");
            return getWritableDatabase();
        }
    }
相關文章
相關標籤/搜索