我使用的是具有延伸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 .LayoutHorizontal(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;
}
對於每一個連接到我打開並關閉它的數據庫。
你是如何實現'SQLiteOpenHelper'類的?你是否創建了一個'open'和'close'方法來獲得'SQLiteDatabase'並關閉它?你的問題是你沒有在你的代碼中爲'SQLiteDatabase'指定'open'和'close'方法?編輯你的問題並添加你的'SQLiteOpenHelper'類。 –
我編輯了這個問題。很抱歉,例外情況是「數據庫已關閉」,但情況相同。 – kiduxa
什麼是'WordDAO'類?你用它做什麼? –