2013-10-29 71 views
0

我使用的是具有延伸SimpleCursorAdapter自定義適配器光標自定義光標適配器所示:「數據庫已經關閉」使用

public class ListWordAdapter extends SimpleCursorAdapter { 

    private LayoutInflater inflater; 
    private Cursor mCursor; 
    private int mLayout; 
    private String[] from; 
    private int[] to; 

    public ListWordAdapter(Context context, int layout, Cursor c, 
      String[] from, int[] to, int flags) { 

     super(context, layout, c, from, to, flags); 
     this.mCursor = c; 
     this.inflater = LayoutInflater.from(context); 
     this.mLayout = layout; 
     this.from = from; 
     this.to = to; 

    } 

    private static class ViewHolder { 
     //public ImageView img; 
     public TextView name; 
     public TextView type; 
     public TextView translate; 

    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     if (mCursor.moveToPosition(position)) { 
      ViewHolder holder; 

      if (convertView == null) { 
       convertView = inflater.inflate(mLayout, null); 
       holder = new ViewHolder(); 
       // holder.img = (ImageView) convertView.findViewById(R.id.img_row); 
       holder.name = (TextView) convertView.findViewById(to[0]); 
       holder.type = (TextView) convertView.findViewById(to[1]); 
       holder.translate = (TextView) convertView.findViewById(to[2]); 

       convertView.setTag(holder); 
      } else { 
       holder = (ViewHolder) convertView.getTag(); 
      } 

      holder.name.setText(mCursor.getString(mCursor.getColumnIndex(from[0]))); 
      holder.type.setText(mCursor.getString(mCursor.getColumnIndex(from[1]))); 
      holder.translate.setText(mCursor.getString(mCursor.getColumnIndex(from[2]))); 
      // holder.img.setImageResource(img_resource); 

     } 

     return convertView; 
    } 

} 

,並在主活動我叫它爲:

adapter = new ListWordAdapter(getSherlockActivity(), R.layout.row_list_words, mCursorWords, from, to, 0); 

當列表中的一個修改之,我調用這個方法:

public void onWordSaved() { 
     WordDAO wordsDao = new WordSqliteDAO(); 
     Cursor mCursorWords = wordsDao.list(getSherlockActivity()); 
     adapter.changeCursor(mCursorWords); 
    } 

這裏的事情是,THI小號產生我此異常:

11月10日至29日:14:33.810:E/AndroidRuntime(18659): java.lang.IllegalStateException:數據庫 /data/data/com.example.palabrasdeldia/databases/ palabrasDelDia(康涅狄格州# 0)已經關閉

完整堆棧跟蹤:

11月10日至29日:14:33.810:E/AndroidRuntime(18659):致命異常:主 11月10日至29日:14:33.810:E/AndroidRuntime(1 8659): java.lang.IllegalStateException:database /data/data/com.example.palabrasdeldia/databases/palabrasDelDia(conn# 0)已關閉10-29 11:14:33.810:E/AndroidRuntime(18659):在 android.database.sqlite.SQLiteDatabase.verifyDbIsOpen(SQLiteDatabase.java:2123) 10-29 11:14:33.810:E/AndroidRuntime(18659):在 android.database.sqlite.SQLiteDatabase.lock(SQLiteDatabase.java :398) 10-29 11:14:33.810:E/AndroidRuntime(18659):at android.database.sqlite.SQLiteDatabase.lock(SQLiteDatabase.java:390) 10-29 11:14:33.810:E/AndroidRuntime(18659):at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:74) 10-29 11:14:33.810:E/AndroidRunt ime(18659):at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:311) 10-29 11:14:33.810:E/AndroidRuntime(18659):at android.database.sqlite.SQLiteCursor。 onMove(SQLiteCursor.java:283) 10-29 11:14:33.810:E/AndroidRuntime(18659):at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:173) 10-29 11:14:33.810 :E/AndroidRuntime(18659):在 > com.example.palabrasdeldia.adapters.ListWordAdapter.getView(ListWordAdapter.java:42) 11月10日至29日:14:33.810:E/AndroidRuntime(18659):在 android.widget.AbsListView.obtainView(AbsListView.java:2128)10-29 11:14:33.810:E/AndroidRuntime(18659):at android.widget.ListView.makeAndAddView(ListView.java:1817)10-29 11:14:33.810:E/AndroidRuntime(18659):at android.widget.ListView.fillSpecific(ListView.java:1361)10- 29 11:14:33.810:E/AndroidRuntime(18659):at android.widget.ListView.layoutChildren(ListView.java:1646)10-29 11:14:33.810:E/AndroidRuntime(18659):at Android.widget.AbsListView.onLayout(AbsListView.java:1979)10-29 11:14:33.810:E/AndroidRuntime(18659):at android.view.View.layout(View.java:9593)10-29 11:14:33.810: E/AndroidRuntime(18659):at android.view.ViewGroup.layout(ViewGroup.java:3877)10-29 11:14:33。810: E/AndroidRuntime(18659):在 android.widget.LinearLayout.setChildFrame(LinearLayout.java:1542) 11月10日至29日:14:33.810:E/AndroidRuntime(18659):在 android.widget.LinearLayout .LayoutHorizo​​ntal(LinearLayout.java:1527) 10-29 11:14: 33.810:E/AndroidRuntime(18659):at android.view.View.layout(View.java:9593)10-29 11:14:33.810: E/AndroidRuntime(18659):at android.view.ViewGroup。 layout(ViewGroup.java:3877)10-29 11:14:33.810: E/AndroidRuntime(18659):at android.widget.FrameLayout.onLayout(FrameLayout.java:40 0)10-29 11:14:33.810:E/AndroidRuntime(18659):at android.view.View.layout(View.java:9593)10-29 11:14:33.810: E/AndroidRuntime(18659) ):at android.view.ViewGroup.layout(ViewGroup.java:3877)10-29 11:14:33.810: E/AndroidRuntime(18659):at android.support.v4.view.ViewPager.onLayout(ViewPager .java:1589)10-29 11:14:33.810:E/AndroidRuntime(18659):at android.view.View.layout(View.java:9593)10-29 11:14:33.810: E/AndroidRuntime(18659):at android.view.ViewGroup.layout(ViewGroup.java:3877)10-29 11:14:33.810: E/AndroidRuntime(18659):at android.widget.FrameLayout.onLayout(FrameLayout。 java:400)10-29 11:14:33.810:E/AndroidRuntime(18659):at android.view.View.layout(View.java:9593)10-29 11:14:33.810: E/AndroidRuntime(18659):at android .view.ViewGroup.layout(ViewGroup.java:3877)10-29 11:14:33.810: E/AndroidRuntime(18659):at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1542) 10-29 11:14:33.810:E/AndroidRuntime(18659):at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1403) 10-29 11:14:33.810:E/AndroidRuntime(18659):at android。 widget.LinearLayout.onLayout(LinearLayout.java:1314)10-29 11:14:33.810:E/AndroidRuntime(18659):at android.view.View.layout(View.java:9593)10-29 11: 14:33.810: E/AndroidRuntime(18659):在 android.view.ViewGroup.layout(ViewGroup.java:3877)11月10日至29日:14:33.810: E/AndroidRuntime(18659):在 android.widget.FrameLayout.onLayout (FrameLayout.java:400)10-29 11:14:33.810:E/AndroidRuntime(18659):at android.view.View.layout(View.java:9593)10-29 11:14:33.810: E/AndroidRuntime(18659):at android.view.ViewGroup.layout(ViewGroup.java:3877)10-29 11:14:33.810: E/AndroidRuntime(18659):at android.widget.LinearLayout.setChildFrame( LinearLayout.java:1542) 10-29 11:14:33.810:E/AndroidRuntime(18659):at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1403) 10-29 11:14:33.810:E/AndroidRuntime(18659):at android.widget.LinearLayout.onLayout(LinearLayout.java:1314)10-29 11:14:33.810:E/AndroidRuntime(18659) android.view.ViewGroup.layout(ViewGroup.java:3877)10-29 11:14:33.810: E/AndroidRuntime(18659):at android.view.ViewGroup.layout(ViewGroup.java:3893)10 -29 11:14:33.810: E/AndroidRuntime(18659):at android.widget.FrameLayout.onLayout(FrameLayout.java:400)10-29 11:14:33.810:E/AndroidRuntime(18659):at android.view.ViewGroup.layout(ViewGroup.java:3877)10-34:14:33.810: E/AndroidRuntime(18659):at android.view.ViewGroup.layout(ViewGroup.java:3877) 29 11:14:33。810: E/AndroidRuntime(18659):at android.widget.FrameLayout.onLayout(FrameLayout.java:400)10-29 11:14:33.810:E/AndroidRuntime(18659):at android.view.View .layout(View.java:9593)10-29 11:14:33.810: E/AndroidRuntime(18659):at android.view.ViewGroup.layout(ViewGroup.java:3877)10-29 11:14:33.810 : E/AndroidRuntime(18659):at android.view.ViewRoot.performTraversals(ViewRoot.java:1253)10-29 11:14:33.810:E/AndroidRuntime(18659):at android.view.ViewRoot。 handleMessage(ViewRoot.java:2017)10-29 11:14:33.810:E/AndroidRuntime(18659):at android.os.Handler.dispatchMessage(Handler.java:99)10-29 11:14:33.810:E/AndroidRuntime(18659):at android.os.Looper.loop(Looper.java:132)10-29 11:14:33.810: E/AndroidRuntime(18659):at android .app.ActivityThread.main(ActivityThread.java:4028)10-29 11:14:33.810:E/AndroidRuntime(18659):at java.lang.reflect.Method.invokeNative(Native Method)10-29 11 :14:33.810:E/AndroidRuntime(18659):在 java.lang.reflect.Method.invoke(Method.java:491)10-29 11:14:33.810: E/AndroidRuntime(18659):at com .android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:844) 10-29 11:14:33.810:E/AndroidRuntime(18659):at com.android.internal.os.ZygoteInit.main( ZygoteInit.java:602)10-29 11:14:33.810:E/AndroidRuntime(18659):在 dalvik.system.NativeStart.main(本機方法)

如果我使用SimpleCursorAdapter,而不是直接ListWordAdapter的,它工作正常。我的自定義適配器實現有什麼問題?堆棧跟蹤中以粗體顯示的行對應於:if​​(mCursor.moveToPosition(position))內部的getView方法。

編輯

我創建了一個自定義的類來管理數據庫操作的開啓和關閉:

public class ConexionBD { 
    private Context context; 
    private SQLiteDatabase database; 
    private DataBaseHelper dbHelper; 

    public ConexionBD(Context context) { 
     this.context = context; 
    } 

    public ConexionBD open() throws SQLException { 
     this.dbHelper = DataBaseHelper.getInstance(context); 
     this.database = dbHelper.getWritableDatabase(); 
     database.execSQL("PRAGMA foreign_keys=ON"); 
     return this; 
    } 

    public void close() { 
     if (database.isOpen() && database != null) { 
      dbHelper.close(); 
     } 
    } 

    /*Getters y setters*/ 
    public SQLiteDatabase getDatabase() { 
     return database; 
    } 

    public void setDatabase(SQLiteDatabase database) { 
     this.database = database; 
    } 

} 

這是我DataBaseHelper:

公共類DataBaseHelper擴展SQLiteOpenHelper {

private static final String DATABASE_NAME = "myDb"; 
private static final int DATABASE_VERSION = 1; 
private static DataBaseHelper sInstance = null; 


public static DataBaseHelper getInstance(Context context) { 

    // Use the application context, which will ensure that you 
    // don't accidentally leak an Activity's context. 
    // See this article for more information: http://bit.ly/6LRzfx 
    if (sInstance == null) { 
     sInstance = new DataBaseHelper(context.getApplicationContext()); 
    } 
    return sInstance; 
} 

@Override 
public void onCreate(SQLiteDatabase database) { 
    ... 
} 
.... 

這是我如何管理一個查詢的例子:

public Cursor list(Context context) { 
     ConexionBD conexion = new ConexionBD(context); 
     Cursor mCursor = null; 
     try{ 
      conexion.open(); 

      mCursor = conexion.getDatabase().query(DataBaseHelper.TABLE_WORD , null , null, null, null, null, Word.NAME); 

      if (mCursor != null) { 
       mCursor.moveToFirst(); 
      } 

     }finally{ 
      conexion.close(); 
     } 

     return mCursor; 
    } 

對於每一個連接到我打開並關閉它的數據庫。

+0

你是如何實現'SQLiteOpenHelper'類的?你是否創建了一個'open'和'close'方法來獲得'SQLiteDatabase'並關閉它?你的問題是你沒有在你的代碼中爲'SQLiteDatabase'指定'open'和'close'方法?編輯你的問題並添加你的'SQLiteOpenHelper'類。 –

+0

我編輯了這個問題。很抱歉,例外情況是「數據庫已關閉」,但情況相同。 – kiduxa

+0

什麼是'WordDAO'類?你用它做什麼? –

回答

0

我發現了這個問題!這是方法getView,特別是該行提到的錯誤:

if (mCursor.moveToPosition(position)) 

我不應該使用構造函數的指針,而不是我得從位置一個新問題:

Cursor cursor = (Cursor) getItem(position); 

這種方式我不試圖訪問數據庫已經關閉的遊標。我發佈的所有代碼都是正確的,唯一的是我在getView方法中使用的遊標。