2013-04-15 56 views
0

我的應用程序運行良好鎖定,直到我碰到這個錯誤的SQLite絆:Android的SQLite的嘗試解鎖讀取鎖,而不是由當前線程

java.lang.IllegalMoniterStateException: attempt to unlock read lock, not locked by current thread 

我試過在計算器上的所有其他的答案,但他們似乎沒有幫助。他們都說我有多個線程創建我的SQLiteDBAdpdter的實例,但我只有Activity,但它的SherlockFragmentActivity。每個類都創建一個新的SQliteDBAdapter實例,所以我不確定這是否是我得到這個錯誤的原因。

我一直堅持這個好幾個小時,而且GREATLY感謝任何幫助。

片段1:

public final class NotesFragment extends SherlockListFragment { 
NotesDbAdapter db; 
private static final int ACTIVITY_EDIT = 1; 

private static final int DELETE_ID = Menu.FIRST + 1; 

public static NotesFragment newInstance(String content) { 
    NotesFragment fragment = new NotesFragment(); 

    return fragment; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    db = new NotesDbAdapter(getActivity()); 

    db.open(); 
    if (db.fetchAllNotes().getCount() == 0) { 
     doWelcomeMessage(); 
    } 
    db.close(); 

} 

private void doWelcomeMessage() { 
    // Show welcome dialog 
    startActivity(new Intent(getActivity(), NotesWelcome.class)); 

} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    if (container == null) { 
     return null; 
    } 

    db = new NotesDbAdapter(getActivity()); 

    db.open(); 
    if (db.fetchAllNotes().getCount() == 0) { 
     doWelcomeMessage(); 
    } 
    db.close(); 


    return ll; 

} 

}

錯誤指向db.open();onCreate()方法。該open()方法是在我SQLiteDBAdapter (NotesDBAdapter)這是如下:

​​

而在我NotesDBAdapter的onCreate()是:

@Override 
    public void onCreate(SQLiteDatabase db) { 

     SQLiteDatabase checkDB = null; 

     String myPath = "data/data/com.xxx.xxx/databases/data.db"; 
     checkDB = SQLiteDatabase.openDatabase(myPath, null, 
       SQLiteDatabase.OPEN_READONLY); 
     if (checkDB != null) { 
      // exists; do nothing 
     } else { 
      // create DB 

      db.execSQL(DATABASE_CREATE); 

     } 

    } 

再次感謝!

編輯 另一個片段

creating a new instance

數據庫的

被稱爲片段2,但我並沒有表現出它的代碼作爲其真的一樣的片段1

回答

1

你寫:

Each of the classes create a new instance of the SQliteDBAdapter, so I'm not sure if this is why I'm getting this error.

我不知道你的意思是這班那裏,因爲我只看到你的榜樣兩個部分類 - NotesFragmentNotesDbAdapter 。但是,如果您的活動依賴於其他每個打開和關閉數據庫的類,那麼您必須確保沒有任何遞歸嘗試來打開數據庫。 (即,A類打開數據庫,然後調用類B,它嘗試使用自己的DBHelper實例打開數據庫。此時,B正嘗試打開數據庫,而A打開數據庫。)

正如前面提到的dongshengcn,這可能是錯誤。在NotesFragment.onCreate中打開數據庫並關閉NotesFragment.onDestroy並將NotesFragment中的db對象轉換爲其他類可能更合適。

接下來的問題是,你的NotesDbAdapter類是否有適當的close方法?它應該看起來像這樣,並且(如上所述)從NotesFragment.onDestroy被調用。

@Override 
    public synchronized void close() { 

     if (mDbHelper != null) { 
      mDbHelper.close(); 
      mDbHelper = null; 
     } 

     super.close(); 
    } 
+0

我已經編輯我的問題,謝謝**但我的應用力,只要其開閉** – AndroidDev

+1

你的意思是,它是在開放FCing這裏建議甚至之前的任何變化,對不對?這並不排除你在這裏得到的建議。這將有助於查看堆棧跟蹤。你也可以嘗試在onCreate()中設置一個斷點並從那裏開始執行代碼。 –

+0

謝謝。我會試試這個,然後回覆給你+1 – AndroidDev

相關問題