定稿尚未停用或关闭的游标 [英] Finalizing a Cursor that has not been deactivated or closed
本文介绍了定稿尚未停用或关闭的游标的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我在我的下面code访问来自源码数据库的数据。
@覆盖
公共无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.profile);
type_spn =(微调)findViewById(R.id.type_spn);
animal_spn =(微调)findViewById(R.id.animal_spn);
habitat_txt =(的TextView)findViewById(R.id.life_txt);
diet_txt =(的TextView)findViewById(R.id.habit_txt);
discription_txt =(的TextView)findViewById(R.id.description_txt); ADB = DBAdpter.getAdapterInstance(SecondActivity.this);
adb.createdatabase();
DB = adb.openDataBase(); CR = db.rawQuery(从动物园独特的类型,新的String [] {}); 如果(cr.getCount()大于0){
cr.moveToFirst();
的for(int i = 0; I< cr.getCount();我++){
字符串类型= cr.getString(0);
cr.moveToNext();
type_list.add(类型);
}
db.close();
ArrayAdapter<串GT; type_add =新ArrayAdapter<串GT;(
SecondActivity.this,R.layout.spinnerlayout,TYPE_LIST);
type_spn.setAdapter(type_add); } type_spn.setOnItemSelectedListener(新OnItemSelectedListener(){ 公共无效onItemSelected(适配器视图<>为arg0,ARG1查看,
INT ARG2,长ARG3){
animal_list.clear();
字符串TYPE_NAME = arg0.getItemAtPosition(ARG2)的ToString();
DB = adb.openDataBase();
CR = db.rawQuery(选择从动物那里动物园型像'
+ TYPE_NAME +%',新的String [] {}); 如果(cr.getCount()大于0){
cr.moveToFirst();
的for(int i = 0; I< cr.getCount();我++){
字符串类型= cr.getString(0);
cr.moveToNext();
animal_list.add(类型);
}
}
db.close();
ArrayAdapter<串GT; type_add =新ArrayAdapter<串GT;(
SecondActivity.this,R.layout.spinnerlayout,
animal_list);
animal_spn.setAdapter(type_add); } 公共无效onNothingSelected(适配器视图<>为arg0){ }
}); animal_spn.setOnItemSelectedListener(新OnItemSelectedListener(){
字符串的栖息地;
串饮食;
字符串描述; 公共无效onItemSelected(适配器视图<>为arg0,ARG1查看,
INT ARG2,长ARG3){
字符串animal_name = arg0.getItemAtPosition(ARG2)的ToString(); DB = adb.openDataBase();
CR = db.rawQuery(
选择的栖息地,饮食,详细描述从动物园其中type像'
+ animal_name +%',新的String [] {}); 如果(cr.getCount()大于0){
Log.v(动画,测试+ cr.getCount());
cr.moveToFirst();
栖息地= cr.getString(0);
饮食= cr.getString(1);
说明= cr.getString(2);
}
db.close();
Log.v(动画,测试+:+栖+:+饮食+:+描述);
habitat_txt.setText(栖息地);
diet_txt.setText(饮食);
discription_txt.setText(介绍); } 公共无效onNothingSelected(适配器视图<>为arg0){ }
});
}
和我收到的错误是这样的。
03-28 18:08:09.356:ERROR /光标(4754):完成尚未停用或关闭的游标。数据库= /data/data/com.zoobuzz/databases/zoo_buzz.sqlite,表=空,查询=选择从动物园其中type像'鸟动物
03-28 18:08:09.356:ERROR /光标(4754):%
03-28 18:08:09.356:ERROR /光标(4754):android.database.sqlite.DatabaseObjectNotClosedException:应用程序没有关闭在这里打开游标或数据库对象
03-28 18:08:09.356:ERROR /光标(4754):在android.database.sqlite.SQLiteCursor<&初始化GT;(SQLiteCursor.java:210)。
03-28 18:08:09.356:ERROR /光标(4754):在android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53)
03-28 18:08:09.356:ERROR /光标(4754):在android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1345)
03-28 18:08:09.356:ERROR /光标(4754):在android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1315)
03-28 18:08:09.356:ERROR /光标(4754):在com.zoobuzz.SecondActivity $ 1.onItemSelected(SecondActivity.java:65)
03-28 18:08:09.356:ERROR /光标(4754):在android.widget.AdapterView.fireOnSelected(AdapterView.java:864)
03-28 18:08:09.356:ERROR /光标(4754):在android.widget.AdapterView.access $ 200(AdapterView.java:42)
03-28 18:08:09.356:ERROR /光标(4754):在android.widget.AdapterView $ SelectionNotifier.run(AdapterView.java:830)
03-28 18:08:09.356:ERROR /光标(4754):在android.os.Handler.handleCallback(Handler.java:587)
03-28 18:08:09.356:ERROR /光标(4754):在android.os.Handler.dispatchMessage(Handler.java:92)
03-28 18:08:09.356:ERROR /光标(4754):在android.os.Looper.loop(Looper.java:123)
03-28 18:08:09.356:ERROR /光标(4754):在android.app.ActivityThread.main(ActivityThread.java:4627)
03-28 18:08:09.356:ERROR /光标(4754):在java.lang.reflect.Method.invokeNative(本机方法)
03-28 18:08:09.356:ERROR /光标(4754):在java.lang.reflect.Method.invoke(Method.java:521)
03-28 18:08:09.356:ERROR /光标(4754):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868)
03-28 18:08:09.356:ERROR /光标(4754):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-28 18:08:09.356:ERROR /光标(4754):在dalvik.system.NativeStart.main(本机方法)
解决方案
不要打开和关闭数据库经常 DB = adb.openDataBase();
,而不是关闭数据库关闭光标 cursor.close();
步骤:
数据库:启动活动打开数据库,并直到活动被关闭时它仍将保持打开状态。 (中的onDestroy()推荐)
光标:当光标的工作获得超过关闭它。
I am accessing data from sqlite data base in my following code.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.profile);
type_spn = (Spinner) findViewById(R.id.type_spn);
animal_spn = (Spinner) findViewById(R.id.animal_spn);
habitat_txt=(TextView)findViewById(R.id.life_txt);
diet_txt=(TextView)findViewById(R.id.habit_txt);
discription_txt=(TextView)findViewById(R.id.description_txt);
adb = DBAdpter.getAdapterInstance(SecondActivity.this);
adb.createdatabase();
db = adb.openDataBase();
cr = db.rawQuery("select distinct type from zoo", new String[] {});
if (cr.getCount() > 0) {
cr.moveToFirst();
for (int i = 0; i < cr.getCount(); i++) {
String type = cr.getString(0);
cr.moveToNext();
type_list.add(type);
}
db.close();
ArrayAdapter<String> type_add = new ArrayAdapter<String>(
SecondActivity.this, R.layout.spinnerlayout, type_list);
type_spn.setAdapter(type_add);
}
type_spn.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
animal_list.clear();
String type_name = arg0.getItemAtPosition(arg2).toString();
db = adb.openDataBase();
cr = db.rawQuery("select animal from zoo where type like '"
+ type_name + "%'", new String[] {});
if (cr.getCount() > 0) {
cr.moveToFirst();
for (int i = 0; i < cr.getCount(); i++) {
String type = cr.getString(0);
cr.moveToNext();
animal_list.add(type);
}
}
db.close();
ArrayAdapter<String> type_add = new ArrayAdapter<String>(
SecondActivity.this, R.layout.spinnerlayout,
animal_list);
animal_spn.setAdapter(type_add);
}
public void onNothingSelected(AdapterView<?> arg0) {
}
});
animal_spn.setOnItemSelectedListener(new OnItemSelectedListener() {
String habitat;
String diet;
String description;
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
String animal_name = arg0.getItemAtPosition(arg2).toString();
db = adb.openDataBase();
cr = db.rawQuery(
"select habitat,diet,discription from zoo where type like '"
+ animal_name + "%'", new String[] {});
if (cr.getCount() > 0) {
Log.v("anim","Test"+cr.getCount());
cr.moveToFirst();
habitat =cr.getString(0);
diet =cr.getString(1);
description =cr.getString(2);
}
db.close();
Log.v("anim","Test"+" : "+habitat+" : "+diet+" : " + description);
habitat_txt.setText(habitat);
diet_txt.setText(diet);
discription_txt.setText(description);
}
public void onNothingSelected(AdapterView<?> arg0) {
}
});
}
and I am getting error like this.
03-28 18:08:09.356: ERROR/Cursor(4754): Finalizing a Cursor that has not been deactivated or closed. database = /data/data/com.zoobuzz/databases/zoo_buzz.sqlite, table = null, query = select animal from zoo where type like 'Bird
03-28 18:08:09.356: ERROR/Cursor(4754): %'
03-28 18:08:09.356: ERROR/Cursor(4754): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
03-28 18:08:09.356: ERROR/Cursor(4754): at android.database.sqlite.SQLiteCursor.<init>(SQLiteCursor.java:210)
03-28 18:08:09.356: ERROR/Cursor(4754): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53)
03-28 18:08:09.356: ERROR/Cursor(4754): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1345)
03-28 18:08:09.356: ERROR/Cursor(4754): at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1315)
03-28 18:08:09.356: ERROR/Cursor(4754): at com.zoobuzz.SecondActivity$1.onItemSelected(SecondActivity.java:65)
03-28 18:08:09.356: ERROR/Cursor(4754): at android.widget.AdapterView.fireOnSelected(AdapterView.java:864)
03-28 18:08:09.356: ERROR/Cursor(4754): at android.widget.AdapterView.access$200(AdapterView.java:42)
03-28 18:08:09.356: ERROR/Cursor(4754): at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:830)
03-28 18:08:09.356: ERROR/Cursor(4754): at android.os.Handler.handleCallback(Handler.java:587)
03-28 18:08:09.356: ERROR/Cursor(4754): at android.os.Handler.dispatchMessage(Handler.java:92)
03-28 18:08:09.356: ERROR/Cursor(4754): at android.os.Looper.loop(Looper.java:123)
03-28 18:08:09.356: ERROR/Cursor(4754): at android.app.ActivityThread.main(ActivityThread.java:4627)
03-28 18:08:09.356: ERROR/Cursor(4754): at java.lang.reflect.Method.invokeNative(Native Method)
03-28 18:08:09.356: ERROR/Cursor(4754): at java.lang.reflect.Method.invoke(Method.java:521)
03-28 18:08:09.356: ERROR/Cursor(4754): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-28 18:08:09.356: ERROR/Cursor(4754): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-28 18:08:09.356: ERROR/Cursor(4754): at dalvik.system.NativeStart.main(Native Method)
解决方案
dont open and close your database frequently db = adb.openDataBase();
instead closing database close your cursor cursor.close();
Step:
Database : Launcher Activity opens Database and it will remains open until the Activity gets closed. (in onDestroy() recommended)
Cursor: When the work of cursor gets over close it.
这篇关于定稿尚未停用或关闭的游标的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文