Android 在何处关闭活动中的光标和数据库对象,无任何异常
在我的应用程序中有很多数据库操作,因此我创建了许多游标来检索数据,而异步任务中使用的游标也很少。现在我的问题是在哪里关闭光标和数据库 异步操作后,当我在Android 在何处关闭活动中的光标和数据库对象,无任何异常,android,android-sqlite,android-cursoradapter,Android,Android Sqlite,Android Cursoradapter,在我的应用程序中有很多数据库操作,因此我创建了许多游标来检索数据,而异步任务中使用的游标也很少。现在我的问题是在哪里关闭光标和数据库 异步操作后,当我在onCreate中关闭游标时,我会得到Null指针异常,如果我在onPause中关闭游标,我仍然会得到Null指针异常,因此我在onDestroy中关闭了游标和数据库 现在我不知道这种方法是否正确。。我想了解在活动中关闭光标和数据库而不影响数据库操作的最佳方法是什么 protected void onCreate(Bundle savedInst
onCreate
中关闭游标时,我会得到Null指针异常
,如果我在onPause
中关闭游标,我仍然会得到Null指针异常
,因此我在onDestroy
中关闭了游标和数据库
现在我不知道这种方法是否正确。。我想了解在活动中关闭光标和数据库而不影响数据库操作的最佳方法是什么
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.stockdetail);
//Helptext.setVisibility(View.INVISIBLE);
Declerations();
d=Database.getInstance(getApplicationContext()).getWritableDatabase();
new popdailydata().execute();
// Above is async task so I have closed after above statement, but if I close cursor getting Null pointer exception
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
selectdate.close();
Database.getInstance(getApplicationContext()).close();
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
//selectdate.close(); --- At this point also I am getting nullpointer exception
Database.getInstance(getApplicationContext()).close();
}
您应该尽快在数据库/游标连接处关闭,这意味着一旦您从中提取数据,您应该关闭所有内容,以免锁定数据库
保持数据库连接是一种糟糕的做法,尤其是对于多线程应用程序而言对于android数据库操作的总体操作,以下是使用内容提供商的重要信息来源: 下面是一个如何实现LoaderManager的示例。您可以在这里找到各种示例: 对于一个基本的实现思想,它应该是这样的:
public class MainActivity extends Activity implements LoaderManager.LoaderCallbacks<Cursor> {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new CursorLoader(this,
ObjectEntity.URI, // Database uri
new String[]{"id"}, // Columns to select
"id=?", // 'where' field
new String[]{"3"}, // Values for 'where' '?' field
null);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
// Do anything you want here with the cursor
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
公共类MainActivity扩展活动实现LoaderManager.LoaderCallbacks{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@凌驾
公共加载器onCreateLoader(int-id,Bundle-args){
返回新的游标装入器(此,
ObjectEntity.URI,//数据库URI
新字符串[]{“id”},//要选择的列
“id=?”,//“where”字段
新字符串[]{“3”},//where''?'字段的值
无效);
}
@凌驾
public void onLoadFinished(加载器、光标数据){
//使用光标在此处执行任何操作
}
@凌驾
公共void onLoaderReset(加载器){
}
}您没有显示您使用
光标的内容,也没有显示显示NPE的logcat输出。光标必须在任何应用程序组件需要的生命周期内保持打开状态。例如,如果将其与SimpleCursorAdapter
一起使用以填充ListView
,则在ListView
和SimpleCursorAdapter
不再使用之前,您无法关闭光标。@squ感谢您的回答,并为没有提供日志而道歉。。。用logcat编辑我的问题。请注意,这仍然不能真正解释如何使用光标。您显示您正在调用一个AsyncTask
,但不是AsyncTask
对检索到的数据所做的操作。@g2o:请记住:因此,不要只是用光标
替换cusor
,而是像我所做的那样解决所有问题。感谢您的回复,但这是我的问题,当我在任何db操作后立即关闭时,它会引发我空指针异常
。在我的问题中,如果我在new popdailydata().execute()之后关闭代码>它给了我exception@tyczj你的答案不完全正确。如果要与适配器
和适配器视图
一起使用,则光标
必须保持打开状态。此外,如果使用SQLiteOpenHelper
,则显式关闭数据库可能有害-请检查源代码。@Siva如果获得null,则表示database.getInstance(getApplicationContext()).getWritableDatabase()
返回null。同时,在启动异步任务后立即关闭也不好,因为在异步任务完成之前,应用程序不会暂停,这会破坏异步任务的目的asynctask@Squonk是的,这是光标需要打开的旧时间,但是如果他只是在拉数据,那么您需要关闭它。它从来没有明确地说,所以我认为它只是拉数据谢谢你的回答。。。将通过链接。
public class MainActivity extends Activity implements LoaderManager.LoaderCallbacks<Cursor> {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new CursorLoader(this,
ObjectEntity.URI, // Database uri
new String[]{"id"}, // Columns to select
"id=?", // 'where' field
new String[]{"3"}, // Values for 'where' '?' field
null);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
// Do anything you want here with the cursor
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}