SQLite的异常,数据库已经关闭 [英] SQLite Exception, Database Already Closed
问题描述
我写了下面的code,这code是创建一个类,它调用类 DataBaseAdapter
。在 DataBaseAdapter
类是负责所有的数据库连接和方法有在数据库中存储的值:
公共类主要扩展活动{
@覆盖
保护无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_main);
DataBaseAdapter DB =新DataBaseAdapter(getApplicationContext());
报警人=新的警报(1,QWER,新的INT [] {1,1,1,0,1,0,1},1,382562495,应用程序,1);
db.addAlarm(人);
滚动型SC =(滚动型)findViewById(R.id.scrollBody);
TableLayout TB = db.getAllAlarmList(getApplicationContext());
sc.addView(TB);
}
}
这是我的logcat:
03-13 17:09:33.388:D / SqliteDatabaseCpp(1095):注册sqlite的记录FUNC:/data/data/com.example.devicecontrolpanel/databases/AlarmSystem
03-13 17:09:33.408:D / SqliteDatabaseCpp(1095):数据库信息:打开数据库,路径= /data/data/com.example.devicecontrolpanel/databases,关键= 9lYvmWqw,标志= 6,不能与stat文件,错误号= 2,消息=没有这样的文件或目录
03-13 17:09:33.408:D / SqliteDatabaseCpp(1095):数据库的信息:PATH = /data/data/com.example.devicecontrolpanel/databases,关键= 9lYvmWqw,处理:0x8ccc98,类型:W,R / W: (0,1),模式:截断,硬盘可用空间:777中号
03-13 17:09:33.588:D / SqliteDatabaseCpp(1095):数据库的信息:关闭分贝,道路= /data/data/com.example.devicecontrolpanel/databases,关键= 9lYvmWqw,手柄= 0x8ccc98,类型= W,R /瓦特=(0,0)
03-13 17:09:33.588:D / SqliteDatabaseCpp(1095):数据库信息:打开数据库,路径= /data/data/com.example.devicecontrolpanel/databases,关键= 9lYvmWqw,标志= 6,文件大小= 4096
03-13 17:09:33.588:D / SqliteDatabaseCpp(1095):数据库的信息:PATH = /data/data/com.example.devicecontrolpanel/databases,关键= 9lYvmWqw,处理:0x8f3100,类型:W,R / W: (0,1),模式:截断,硬盘可用空间:777中号
03-13 17:09:33.588:D / SqliteDatabaseCpp(1095):数据库的信息:关闭分贝,道路= /data/data/com.example.devicecontrolpanel/databases,关键= 9lYvmWqw,手柄= 0x8f3100,类型= W,R /瓦特=(0,0)
03-13 17:09:33.598:D / AndroidRuntime(1095):关闭虚拟机
03-13 17:09:33.598:W / dalvikvm(1095):主题ID = 1:螺纹退出与未捕获的异常(组= 0x40ae0228)
03-13 17:09:33.618:E / AndroidRuntime(1095):致命异常:主要
03-13 17:09:33.618:E / AndroidRuntime(1095):java.lang.RuntimeException的:无法启动的活动ComponentInfo {com.example.devicecontrolpanel / com.example.devicecontrolpanel.Main}:java.lang.IllegalStateException:数据库/data/data/com.example.devicecontrolpanel/databases/AlarmSystem(康涅狄格州#0)已关闭
03-13 17:09:33.618:E / AndroidRuntime(1095):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2205)
03-13 17:09:33.618:E / AndroidRuntime(1095):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2240)
03-13 17:09:33.618:E / AndroidRuntime(1095):在android.app.ActivityThread.access $ 600(ActivityThread.java:139)
03-13 17:09:33.618:E / AndroidRuntime(1095):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1262)
03-13 17:09:33.618:E / AndroidRuntime(1095):在android.os.Handler.dispatchMessage(Handler.java:99)
03-13 17:09:33.618:E / AndroidRuntime(1095):在android.os.Looper.loop(Looper.java:156)
03-13 17:09:33.618:E / AndroidRuntime(1095):在android.app.ActivityThread.main(ActivityThread.java:4987)
03-13 17:09:33.618:E / AndroidRuntime(1095):在java.lang.reflect.Method.invokeNative(本机方法)
03-13 17:09:33.618:E / AndroidRuntime(1095):在java.lang.reflect.Method.invoke(Method.java:511)
03-13 17:09:33.618:E / AndroidRuntime(1095):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)
03-13 17:09:33.618:E / AndroidRuntime(1095):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
03-13 17:09:33.618:E / AndroidRuntime(1095):在dalvik.system.NativeStart.main(本机方法)
03-13 17:09:33.618:E / AndroidRuntime(1095):致:java.lang.IllegalStateException:数据库/data/data/com.example.devicecontrolpanel/databases/AlarmSystem(康涅狄格州#0)已关闭
03-13 17:09:33.618:E / AndroidRuntime(1095):在android.database.sqlite.SQLiteDatabase.verifyDbIsOpen(SQLiteDatabase.java:2194)
03-13 17:09:33.618:E / AndroidRuntime(1095):在android.database.sqlite.SQLiteDatabase.lock(SQLiteDatabase.java:448)
03-13 17:09:33.618:E / AndroidRuntime(1095):在android.database.sqlite.SQLiteDatabase.lock(SQLiteDatabase.java:435)
03-13 17:09:33.618:E / AndroidRuntime(1095):在android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:79)
03-13 17:09:33.618:E / AndroidRuntime(1095):在android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:176)
03-13 17:09:33.618:E / AndroidRuntime(1095):在android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:168)
03-13 17:09:33.618:E / AndroidRuntime(1095):在com.example.devicecontrolpanel.DataBaseAdapter.getAlarmsCount(DataBaseAdapter.java:190)
03-13 17:09:33.618:E / AndroidRuntime(1095):在com.example.devicecontrolpanel.DataBaseAdapter.getAllAlarmList(DataBaseAdapter.java:117)
03-13 17:09:33.618:E / AndroidRuntime(1095):在com.example.devicecontrolpanel.Main.onCreate(Main.java:19)
03-13 17:09:33.618:E / AndroidRuntime(1095):在android.app.Activity.performCreate(Activity.java:4538)
03-13 17:09:33.618:E / AndroidRuntime(1095):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071)
03-13 17:09:33.618:E / AndroidRuntime(1095):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2161)
03-13 17:09:33.618:E / AndroidRuntime(1095):11 ...更多
03-13 17:16:48.144:D / SqliteDatabaseCpp(2080):注册sqlite的记录FUNC:/data/data/com.example.devicecontrolpanel/databases/AlarmSystem
03-13 17:16:48.144:D / SqliteDatabaseCpp(2080):数据库信息:打开数据库,路径= /data/data/com.example.devicecontrolpanel/databases,关键= 9lYvmWqw,标志= 6,不能与stat文件,错误号= 2,消息=没有这样的文件或目录
03-13 17:16:48.164:D / SqliteDatabaseCpp(2080):数据库的信息:PATH = /data/data/com.example.devicecontrolpanel/databases,关键= 9lYvmWqw,处理:0x86b220,类型:W,R / W: (0,1),模式:截断,硬盘可用空间:777中号
03-13 17:16:48.384:D / SqliteDatabaseCpp(2080):数据库的信息:关闭分贝,道路= /data/data/com.example.devicecontrolpanel/databases,关键= 9lYvmWqw,手柄= 0x86b220,类型= W,R /瓦特=(0,0)
03-13 17:16:48.384:D / SqliteDatabaseCpp(2080):数据库信息:打开数据库,路径= /data/data/com.example.devicecontrolpanel/databases,关键= 9lYvmWqw,标志= 6,文件大小= 5120
03-13 17:16:48.384:D / SqliteDatabaseCpp(2080):数据库的信息:PATH = /data/data/com.example.devicecontrolpanel/databases,关键= 9lYvmWqw,处理:0x897800,类型:W,R / W: (0,1),模式:截断,硬盘可用空间:777中号
03-13 17:16:48.384:D / SqliteDatabaseCpp(2080):数据库的信息:关闭分贝,道路= /data/data/com.example.devicecontrolpanel/databases,关键= 9lYvmWqw,手柄= 0x897800,类型= W,R /瓦特=(0,0)
03-13 17:16:48.394:D / AndroidRuntime(2080):关闭虚拟机
03-13 17:16:48.414:W / dalvikvm(2080):主题ID = 1:螺纹退出与未捕获的异常(组= 0x40ae0228)
03-13 17:16:48.424:E / AndroidRuntime(2080):致命异常:主要
03-13 17:16:48.424:E / AndroidRuntime(2080):java.lang.RuntimeException的:无法启动的活动ComponentInfo {com.example.devicecontrolpanel / com.example.devicecontrolpanel.Main}:java.lang.IllegalStateException:数据库/data/data/com.example.devicecontrolpanel/databases/AlarmSystem(康涅狄格州#0)已关闭
03-13 17:16:48.424:E / AndroidRuntime(2080):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2205)
03-13 17:16:48.424:E / AndroidRuntime(2080):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2240)
03-13 17:16:48.424:E / AndroidRuntime(2080):在android.app.ActivityThread.access $ 600(ActivityThread.java:139)
03-13 17:16:48.424:E / AndroidRuntime(2080):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1262)
03-13 17:16:48.424:E / AndroidRuntime(2080):在android.os.Handler.dispatchMessage(Handler.java:99)
03-13 17:16:48.424:E / AndroidRuntime(2080):在android.os.Looper.loop(Looper.java:156)
03-13 17:16:48.424:E / AndroidRuntime(2080):在android.app.ActivityThread.main(ActivityThread.java:4987)
03-13 17:16:48.424:E / AndroidRuntime(2080):在java.lang.reflect.Method.invokeNative(本机方法)
03-13 17:16:48.424:E / AndroidRuntime(2080):在java.lang.reflect.Method.invoke(Method.java:511)
03-13 17:16:48.424:E / AndroidRuntime(2080):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)
03-13 17:16:48.424:E / AndroidRuntime(2080):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
03-13 17:16:48.424:E / AndroidRuntime(2080):在dalvik.system.NativeStart.main(本机方法)
03-13 17:16:48.424:E / AndroidRuntime(2080):致:java.lang.IllegalStateException:数据库/data/data/com.example.devicecontrolpanel/databases/AlarmSystem(康涅狄格州#0)已关闭
03-13 17:16:48.424:E / AndroidRuntime(2080):在android.database.sqlite.SQLiteDatabase.verifyDbIsOpen(SQLiteDatabase.java:2194)
03-13 17:16:48.424:E / AndroidRuntime(2080):在android.database.sqlite.SQLiteDatabase.lock(SQLiteDatabase.java:448)
03-13 17:16:48.424:E / AndroidRuntime(2080):在android.database.sqlite.SQLiteDatabase.lock(SQLiteDatabase.java:435)
03-13 17:16:48.424:E / AndroidRuntime(2080):在android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:79)
03-13 17:16:48.424:E / AndroidRuntime(2080):在android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:176)
03-13 17:16:48.424:E / AndroidRuntime(2080):在android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:168)
03-13 17:16:48.424:E / AndroidRuntime(2080):在com.example.devicecontrolpanel.DataBaseAdapter.getAlarmsCount(DataBaseAdapter.java:196)
03-13 17:16:48.424:E / AndroidRuntime(2080):在com.example.devicecontrolpanel.DataBaseAdapter.getAllAlarmList(DataBaseAdapter.java:123)
03-13 17:16:48.424:E / AndroidRuntime(2080):在com.example.devicecontrolpanel.Main.onCreate(Main.java:19)
03-13 17:16:48.424:E / AndroidRuntime(2080):在android.app.Activity.performCreate(Activity.java:4538)
03-13 17:16:48.424:E / AndroidRuntime(2080):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071)
03-13 17:16:48.424:E / AndroidRuntime(2080):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2161)
03-13 17:16:48.424:E / AndroidRuntime(2080):11 ...更多
我收到错误,SQL异常,数据库已经关闭。但我没有得到为什么和怎样? 该怎么办。请帮助。
下面是$ C $下getAllAlarmList:
市民报警getAlarm(INT ID)
{
SQLiteDatabase DB = this.getReadableDatabase();
的String []科拉姆= {KEY_ALARM_ID,KEY_DESC,KEY_REPEAT_DAY,KEY_REPEAT_TYPE,KEY_CALENDAR,KEY_APP,KEY_ACTIVE};
光标光标= db.query(TABLE_NAME,科拉姆,KEY_ALARM_ID +=?,新的String [] {将String.valueOf(ID)},NULL,NULL,NULL);
如果(光标!= NULL)
cursor.moveToFirst();
其他
返回null;
INT alarm_id =的Integer.parseInt(cursor.getString(0));
desc字符串= cursor.getString(1);
串dayRepeat = cursor.getString(2);
INT [] repeatDay =新INT [7];
为(中间体米= 0;米7;;米++)
{
repeatDay [米] =的Integer.parseInt(Character.toString(dayRepeat.charAt(米)));
}
INT repeatType =的Integer.parseInt(cursor.getString(3));
日历CAL = Calendar.getInstance();
cal.setTimeInMillis(的Long.parseLong(cursor.getString(4)));
字符串app = cursor.getString(5);
INT活性=的Integer.parseInt(cursor.getString(6));
//改变dayRepeat字符串为int []
报警报警=新的报警(alarm_id,递减,repeatDay,repeatType,cal.getTimeInMillis(),应用程序,活动);
db.close();
返回报警;
}
公共TableLayout getAllAlarmList(上下文CON)
{
SQLiteDatabase DB = this.getReadableDatabase();
TableLayout体=新TableLayout(CON);
TableLayout.LayoutParams TbodyLayout =新TableLayout.LayoutParams(新的LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));
body.setLayoutParams(TbodyLayout);
body.setBackgroundColor(Color.BLACK);
的LayoutParams布局=新的LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);
如果(getAlarmsCount()大于0)
{
INT MAXCOUNT = getAlarmsCount();
字符串selectQuery =SELECT * FROM+ TABLE_NAME;
光标光标= db.rawQuery(selectQuery,NULL);
如果(cursor.moveToFirst())
{
的TableRow [] TR =新的TableRow [MAXCOUNT]
复选框[] =检查新的复选框[MAXCOUNT]
initializeCheckBoxId(MAXCOUNT);
INT checkboxid = 100;
INT alarm_id;
的for(int i = 0; I< MAXCOUNT;我++)
{
TR [i] =新的TableRow(CON);
检查[i] =新的复选框(CON);
alarm_id =的Integer.parseInt(cursor.getString(0));
报警器报警= getAlarm(alarm_id);
检查[I] .setText(alarm.getTimeInString()+\ N+ alarm.getDesc()+\ N+ alarm.getRepeatTypeInString());
检查[I] .setVisibility(1);
检查[I] .setEnabled(假);
如果(alarm.getActive()== 1)
{
检查[I] .setEnabled(真正的);
}
setCheckBoxId(checkboxid + alarm.getAlarmId());
检查[I] .setId(checkboxid + alarm.getAlarmId());
检查[I] .setTextColor(Color.WHITE);
TR [I] .addView(查看[I]);
TR [I] .setLayoutParams(布局);
如果(我%2 == 0)
{
TR [I] .setBackgroundColor(Color.DKGRAY);
}
其他
{
TR [I] .setBackgroundColor(Color.GRAY);
}
body.addView(TR [I]);
}
}
其他
{
TextView的电视=新的TextView(CON);
TV.setText(无报警设置。);
TV.setTextColor(Color.WHITE);
TV.setVisibility(1);
的TableRow的TableRow =新的TableRow(CON);
tableRow.setLayoutParams(布局);
body.addView(tablerow的);
}
}
其他
{
TextView的电视=新的TextView(CON);
TV.setText(无报警设置。);
TV.setTextColor(Color.WHITE);
TV.setVisibility(1);
的TableRow的TableRow =新的TableRow(CON);
tableRow.setLayoutParams(布局);
body.addView(tablerow的);
}
db.close();
返回身体;
}
下面是code报警添加到数据库中:
公共无效addAlarm(报警器报警)
{
SQLiteDatabase DB = this.getWritableDatabase();
ContentValues值=新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,空,价值观);
db.close();
}
这里是code获取报警计数:
公众诠释getAlarmsCount(){
字符串countQuery =SELECT * FROM+ TABLE_NAME;
SQLiteDatabase DB = this.getReadableDatabase();
光标光标= db.rawQuery(countQuery,NULL);
cursor.close();
//返回计数
db.close();
返回cursor.getCount();
}
您拨打关闭()
于底层 SQLiteDatabase
。你应该叫<一href="http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#close%28%29"相对=nofollow> SQLiteOpenHelper.close()
代替。将所有 db.close()
到 this.close()
或纯关闭()
SQLiteDatabase DB = this.getReadableDatabase();
...
this.close();
如果你调用 SQLiteDatabase.close()
,而不是 SQLiteOpenHelper.close()
的<$ C $的C> SQLiteOpenHelper 不知道这一点,并返回已经关闭 SQLiteDatabase
对象。
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 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,0,1,0,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 , key = 9lYvmWqw, 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, path = /data/data/com.example.devicecontrolpanel/databases , key = 9lYvmWqw, handle = 0x8ccc98, type = w, r/w = (0, 0)
03-13 17:09:33.588: D/SqliteDatabaseCpp(1095): DB info: open db, path = /data/data/com.example.devicecontrolpanel/databases , key = 9lYvmWqw, flag = 6, file size = 4096
03-13 17:09:33.588: D/SqliteDatabaseCpp(1095): DB info: path = /data/data/com.example.devicecontrolpanel/databases , key = 9lYvmWqw, handle: 0x8f3100, 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, path = /data/data/com.example.devicecontrolpanel/databases , key = 9lYvmWqw, handle = 0x8f3100, type = w, r/w = (0, 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, 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:16:48.164: D/SqliteDatabaseCpp(2080): DB info: path = /data/data/com.example.devicecontrolpanel/databases , key = 9lYvmWqw, handle: 0x86b220, type: w, r/w: (0,1), mode: truncate, disk free size: 777 M
03-13 17:16:48.384: D/SqliteDatabaseCpp(2080): DB info: close db, path = /data/data/com.example.devicecontrolpanel/databases , key = 9lYvmWqw, handle = 0x86b220, type = w, r/w = (0, 0)
03-13 17:16:48.384: D/SqliteDatabaseCpp(2080): DB info: open db, path = /data/data/com.example.devicecontrolpanel/databases , key = 9lYvmWqw, flag = 6, file size = 5120
03-13 17:16:48.384: D/SqliteDatabaseCpp(2080): DB info: path = /data/data/com.example.devicecontrolpanel/databases , key = 9lYvmWqw, handle: 0x897800, type: w, r/w: (0,1), mode: truncate, disk free size: 777 M
03-13 17:16:48.384: D/SqliteDatabaseCpp(2080): DB info: close db, path = /data/data/com.example.devicecontrolpanel/databases , key = 9lYvmWqw, handle = 0x897800, type = w, r/w = (0, 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, 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, null, 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();
}
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 SQLiteDatabase
object.
这篇关于SQLite的异常,数据库已经关闭的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!