SQLite Exception, Database Already Closed

SQLite Exception, Database Already Closed,第1张

概述http://androiddev.orkitra.com/?p=30756 I am writing the following code, this code is for creating a class which calls a class DataBaseAdapter . the DataBaseAdapter Class is responsible for all databas

http://androiddev.orkitra.com/?p=30756

I am writing the following code,this code is for creating a class which calls a class

DataBaseAdapter

. the

Class is responsible for all database connectivity and methods are there for storing values in database.:

  
public class Main extends Activity { @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); DataBaseAdapter db = new DataBaseAdapter(getApplicationContext()); Alarm al = new Alarm(1,"qwer",new int[] {1,1,1},382562495,"App",1); db.addAlarm(al); ScrollVIEw sc= (ScrollVIEw) findVIEwByID(R.ID.scrollBody); tableLayout tb = db.getAllAlarmList(getApplicationContext()); sc.addVIEw(tb); } }

This is my logcat:

03-13 17:09:33.388: D/sqliteDatabaseCpp(1095): Registering sqlite logging func: /data/data/com.example.devicecontrolpanel/databases/AlarmSystem 03-13 17:09:33.408: D/sqliteDatabaseCpp(1095): DB info: open db,path = /data/data/com.example.devicecontrolpanel/databases,key = 9lYvmWqw,flag = 6,cannot stat file,errno = 2,message = No such file or directory 03-13 17:09:33.408: D/sqliteDatabaseCpp(1095): DB info: path = /data/data/com.example.devicecontrolpanel/databases,handle: 0x8ccc98,type: w,r/w: (0,1),mode: truncate,disk free size: 777 M 03-13 17:09:33.588: D/sqliteDatabaseCpp(1095): DB info: close db,handle = 0x8ccc98,type = w,r/w = (0,0) 03-13 17:09:33.588: D/sqliteDatabaseCpp(1095): DB info: open db,file size = 4096 03-13 17:09:33.588: D/sqliteDatabaseCpp(1095): DB info: path = /data/data/com.example.devicecontrolpanel/databases,handle: 0x8f3100,handle = 0x8f3100,0) 03-13 17:09:33.598: D/AndroIDRuntime(1095): Shutting down VM 03-13 17:09:33.598: W/dalvikvm(1095): threadID=1: thread exiting with uncaught exception (group=0x40ae0228) 03-13 17:09:33.618: E/AndroIDRuntime(1095): FATAL EXCEPTION: main 03-13 17:09:33.618: E/AndroIDRuntime(1095): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.devicecontrolpanel/com.example.devicecontrolpanel.Main}: java.lang.IllegalStateException: database /data/data/com.example.devicecontrolpanel/databases/AlarmSystem (conn# 0) already closed 03-13 17:09:33.618: E/AndroIDRuntime(1095): at androID.app.ActivityThread.performlaunchActivity(ActivityThread.java:2205) 03-13 17:09:33.618: E/AndroIDRuntime(1095): at androID.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2240) 03-13 17:09:33.618: E/AndroIDRuntime(1095): at androID.app.ActivityThread.access$600(ActivityThread.java:139) 03-13 17:09:33.618: E/AndroIDRuntime(1095): at androID.app.ActivityThread$H.handleMessage(ActivityThread.java:1262) 03-13 17:09:33.618: E/AndroIDRuntime(1095): at androID.os.Handler.dispatchMessage(Handler.java:99) 03-13 17:09:33.618: E/AndroIDRuntime(1095): at androID.os.Looper.loop(Looper.java:156) 03-13 17:09:33.618: E/AndroIDRuntime(1095): at androID.app.ActivityThread.main(ActivityThread.java:4987) 03-13 17:09:33.618: E/AndroIDRuntime(1095): at java.lang.reflect.Method.invokeNative(Native Method) 03-13 17:09:33.618: E/AndroIDRuntime(1095): at java.lang.reflect.Method.invoke(Method.java:511) 03-13 17:09:33.618: E/AndroIDRuntime(1095): at com.androID.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 03-13 17:09:33.618: E/AndroIDRuntime(1095): at com.androID.internal.os.ZygoteInit.main(ZygoteInit.java:551) 03-13 17:09:33.618: E/AndroIDRuntime(1095): at dalvik.system.NativeStart.main(Native Method) 03-13 17:09:33.618: E/AndroIDRuntime(1095): Caused by: java.lang.IllegalStateException: database /data/data/com.example.devicecontrolpanel/databases/AlarmSystem (conn# 0) already closed 03-13 17:09:33.618: E/AndroIDRuntime(1095): at androID.database.sqlite.sqliteDatabase.verifyDbIsOpen(sqliteDatabase.java:2194) 03-13 17:09:33.618: E/AndroIDRuntime(1095): at androID.database.sqlite.sqliteDatabase.lock(sqliteDatabase.java:448) 03-13 17:09:33.618: E/AndroIDRuntime(1095): at androID.database.sqlite.sqliteDatabase.lock(sqliteDatabase.java:435) 03-13 17:09:33.618: E/AndroIDRuntime(1095): at androID.database.sqlite.sqlitequery.fillWindow(sqlitequery.java:79) 03-13 17:09:33.618: E/AndroIDRuntime(1095): at androID.database.sqlite.sqliteCursor.fillWindow(sqliteCursor.java:176) 03-13 17:09:33.618: E/AndroIDRuntime(1095): at androID.database.sqlite.sqliteCursor.getCount(sqliteCursor.java:168) 03-13 17:09:33.618: E/AndroIDRuntime(1095): at com.example.devicecontrolpanel.DataBaseAdapter.getAlarmsCount(DataBaseAdapter.java:190) 03-13 17:09:33.618: E/AndroIDRuntime(1095): at com.example.devicecontrolpanel.DataBaseAdapter.getAllAlarmList(DataBaseAdapter.java:117) 03-13 17:09:33.618: E/AndroIDRuntime(1095): at com.example.devicecontrolpanel.Main.onCreate(Main.java:19) 03-13 17:09:33.618: E/AndroIDRuntime(1095): at androID.app.Activity.performCreate(Activity.java:4538) 03-13 17:09:33.618: E/AndroIDRuntime(1095): at androID.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071) 03-13 17:09:33.618: E/AndroIDRuntime(1095): at androID.app.ActivityThread.performlaunchActivity(ActivityThread.java:2161) 03-13 17:09:33.618: E/AndroIDRuntime(1095): ... 11 more 03-13 17:16:48.144: D/sqliteDatabaseCpp(2080): Registering sqlite logging func: /data/data/com.example.devicecontrolpanel/databases/AlarmSystem 03-13 17:16:48.144: D/sqliteDatabaseCpp(2080): DB info: open db,message = No such file or directory 03-13 17:16:48.164: D/sqliteDatabaseCpp(2080): DB info: path = /data/data/com.example.devicecontrolpanel/databases,handle: 0x86b220,disk free size: 777 M 03-13 17:16:48.384: D/sqliteDatabaseCpp(2080): DB info: close db,handle = 0x86b220,0) 03-13 17:16:48.384: D/sqliteDatabaseCpp(2080): DB info: open db,file size = 5120 03-13 17:16:48.384: D/sqliteDatabaseCpp(2080): DB info: path = /data/data/com.example.devicecontrolpanel/databases,handle: 0x897800,handle = 0x897800,0) 03-13 17:16:48.394: D/AndroIDRuntime(2080): Shutting down VM 03-13 17:16:48.414: W/dalvikvm(2080): threadID=1: thread exiting with uncaught exception (group=0x40ae0228) 03-13 17:16:48.424: E/AndroIDRuntime(2080): FATAL EXCEPTION: main 03-13 17:16:48.424: E/AndroIDRuntime(2080): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.devicecontrolpanel/com.example.devicecontrolpanel.Main}: java.lang.IllegalStateException: database /data/data/com.example.devicecontrolpanel/databases/AlarmSystem (conn# 0) already closed 03-13 17:16:48.424: E/AndroIDRuntime(2080): at androID.app.ActivityThread.performlaunchActivity(ActivityThread.java:2205) 03-13 17:16:48.424: E/AndroIDRuntime(2080): at androID.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2240) 03-13 17:16:48.424: E/AndroIDRuntime(2080): at androID.app.ActivityThread.access$600(ActivityThread.java:139) 03-13 17:16:48.424: E/AndroIDRuntime(2080): at androID.app.ActivityThread$H.handleMessage(ActivityThread.java:1262) 03-13 17:16:48.424: E/AndroIDRuntime(2080): at androID.os.Handler.dispatchMessage(Handler.java:99) 03-13 17:16:48.424: E/AndroIDRuntime(2080): at androID.os.Looper.loop(Looper.java:156) 03-13 17:16:48.424: E/AndroIDRuntime(2080): at androID.app.ActivityThread.main(ActivityThread.java:4987) 03-13 17:16:48.424: E/AndroIDRuntime(2080): at java.lang.reflect.Method.invokeNative(Native Method) 03-13 17:16:48.424: E/AndroIDRuntime(2080): at java.lang.reflect.Method.invoke(Method.java:511) 03-13 17:16:48.424: E/AndroIDRuntime(2080): at com.androID.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 03-13 17:16:48.424: E/AndroIDRuntime(2080): at com.androID.internal.os.ZygoteInit.main(ZygoteInit.java:551) 03-13 17:16:48.424: E/AndroIDRuntime(2080): at dalvik.system.NativeStart.main(Native Method) 03-13 17:16:48.424: E/AndroIDRuntime(2080): Caused by: java.lang.IllegalStateException: database /data/data/com.example.devicecontrolpanel/databases/AlarmSystem (conn# 0) already closed 03-13 17:16:48.424: E/AndroIDRuntime(2080): at androID.database.sqlite.sqliteDatabase.verifyDbIsOpen(sqliteDatabase.java:2194) 03-13 17:16:48.424: E/AndroIDRuntime(2080): at androID.database.sqlite.sqliteDatabase.lock(sqliteDatabase.java:448) 03-13 17:16:48.424: E/AndroIDRuntime(2080): at androID.database.sqlite.sqliteDatabase.lock(sqliteDatabase.java:435) 03-13 17:16:48.424: E/AndroIDRuntime(2080): at androID.database.sqlite.sqlitequery.fillWindow(sqlitequery.java:79) 03-13 17:16:48.424: E/AndroIDRuntime(2080): at androID.database.sqlite.sqliteCursor.fillWindow(sqliteCursor.java:176) 03-13 17:16:48.424: E/AndroIDRuntime(2080): at androID.database.sqlite.sqliteCursor.getCount(sqliteCursor.java:168) 03-13 17:16:48.424: E/AndroIDRuntime(2080): at com.example.devicecontrolpanel.DataBaseAdapter.getAlarmsCount(DataBaseAdapter.java:196) 03-13 17:16:48.424: E/AndroIDRuntime(2080): at com.example.devicecontrolpanel.DataBaseAdapter.getAllAlarmList(DataBaseAdapter.java:123) 03-13 17:16:48.424: E/AndroIDRuntime(2080): at com.example.devicecontrolpanel.Main.onCreate(Main.java:19) 03-13 17:16:48.424: E/AndroIDRuntime(2080): at androID.app.Activity.performCreate(Activity.java:4538) 03-13 17:16:48.424: E/AndroIDRuntime(2080): at androID.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071) 03-13 17:16:48.424: E/AndroIDRuntime(2080): at androID.app.ActivityThread.performlaunchActivity(ActivityThread.java:2161) 03-13 17:16:48.424: E/AndroIDRuntime(2080): ... 11 more   
I am getting the error,sql Exception,database already closed. but I am not getting why and how.?
What to do. Please Help.

Here is the code for getAllAlarmList:

public Alarm getAlarm(int ID) { sqliteDatabase db = this.getReadableDatabase(); String[] colum = {KEY_ALARM_ID,KEY_DESC,KEY_REPEAT_DAY,KEY_REPEAT_TYPE,KEY_CALENDAR,KEY_APP,KEY_ACTIVE}; Cursor cursor = db.query(table_name,colum,KEY_ALARM_ID +"=?",new String[] { String.valueOf(ID) },null,null); if (cursor != null) cursor.movetoFirst(); else return null; int alarm_ID=Integer.parseInt(cursor.getString(0)); String desc = cursor.getString(1); String dayRepeat = cursor.getString(2); int[] repeatDay = new int[7]; for(int m=0;m<7;m++) { repeatDay[m]=Integer.parseInt(Character.toString(dayRepeat.charat(m))); } int repeatType = Integer.parseInt(cursor.getString(3)); Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(Long.parseLong(cursor.getString(4))); String app = cursor.getString(5); int active = Integer.parseInt(cursor.getString(6)); //change dayRepeat String to int[] Alarm alarm = new Alarm(alarm_ID,desc,repeatDay,repeatType,cal.getTimeInMillis(),app,active); db.close(); return alarm; } public tableLayout getAllAlarmList(Context con) { sqliteDatabase db = this.getReadableDatabase(); tableLayout body = new tableLayout(con); tableLayout.LayoutParams tbodyLayout = new tableLayout.LayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT)); body.setLayoutParams(tbodyLayout); body.setBackgroundcolor(color.BLACK); LayoutParams layout = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT); if(getAlarmsCount()>0) { int maxCount = getAlarmsCount(); String selectquery = "SELECT * FROM " + table_name; Cursor cursor = db.rawquery(selectquery,null); if(cursor.movetoFirst()) { tableRow[] tr = new tableRow[maxCount]; CheckBox[] check = new CheckBox[maxCount]; initializeCheckBoxID(maxCount); int checkBoxID = 100; int alarm_ID; for(int i=0;i<maxCount;i++) { tr[i] = new tableRow(con); check[i]= new CheckBox(con); alarm_ID=Integer.parseInt(cursor.getString(0)); Alarm alarm = getAlarm(alarm_ID); check[i].setText(alarm.getTimeInString()+"n"+alarm.getDesc()+"n"+alarm.getRepeatTypeInString()); check[i].setVisibility(1); check[i].setEnabled(false); if(alarm.getActive()==1) { check[i].setEnabled(true); } setCheckBoxID(checkBoxID+alarm.getAlarmID()); check[i].setID(checkBoxID+alarm.getAlarmID()); check[i].setTextcolor(color.WHITE); tr[i].addVIEw(check[i]); tr[i].setLayoutParams(layout); if(i%2==0) { tr[i].setBackgroundcolor(color.DKGRAY); } else { tr[i].setBackgroundcolor(color.GRAY); } body.addVIEw(tr[i]); } } else { TextVIEw TV = new TextVIEw(con); TV.setText("No Alarms Set."); TV.setTextcolor(color.WHITE); TV.setVisibility(1); tableRow tableRow = new tableRow(con); tableRow.setLayoutParams(layout); body.addVIEw(tableRow); } } else { TextVIEw TV = new TextVIEw(con); TV.setText("No Alarms Set."); TV.setTextcolor(color.WHITE); TV.setVisibility(1); tableRow tableRow = new tableRow(con); tableRow.setLayoutParams(layout); body.addVIEw(tableRow); } db.close(); return body; }   Here is the code to add the alarm to the database:

public voID addAlarm(Alarm alarm) { sqliteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); //values.put(KEY_ALARM_ID,alarm.getAlarmID()); values.put(KEY_DESC,alarm.getDesc()); values.put(KEY_REPEAT_DAY,alarm.getRepeatDay()); values.put(KEY_REPEAT_TYPE,alarm.getRepeatType()); values.put(KEY_CALENDAR,Long.toString(alarm.getCalendarInMillis())); values.put(KEY_APP,alarm.getApp()); values.put(KEY_ACTIVE,alarm.getActive()); db.insert(table_name,values); db.close(); }   here is the code for getting the alarm count:

public int getAlarmsCount() { String countquery = "SELECT * FROM " + table_name; sqliteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawquery(countquery,null); cursor.close(); // return count db.close(); return cursor.getCount(); }   

Answer

You call

close()

on the underlying

sqliteDatabase

. You should call

SQLiteOpenHelper.close()

instead. Change all

db.close()

into

this.close()

or plain

close()

sqliteDatabase db = this.getReadableDatabase(); ... this.close();   If you call

sqliteDatabase.close()

instead of

sqliteOpenHelper.close()

,the

sqliteOpenHelper

cannot kNow this and returns the already closed

object.

总结

以上是内存溢出为你收集整理的SQLite Exception, Database Already Closed全部内容,希望文章能够帮你解决SQLite Exception, Database Already Closed所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1173515.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)