究竟在Activity中查询SQLite数据库的位置?

时间:2013-08-16 14:30:16

标签: android android-sqlite android-adapter

一直在与app崩溃作斗争。是时候寻求帮助了......

我第一次使用SQLite。我正在尝试在ListView中显示一个简单的事件日志。

主要活动显示一个小ListView中的日志。如果单击它,它将启动另一个显示全屏ListView的活动。但我也从“首选项”屏幕返回问题。所以问题出在主要活动中。

主要活动在启动应用程序时运行良好。但是当它从另一个Activity返回时偶尔会崩溃:无法恢复活动...试图重新查询已经关闭的游标。我没有解决方案就尝试过各种各样的变化。在调试中,它似乎甚至无法进入onResume?

有人可以指出每个数据库代码应该去哪里(onStart,onResume,onRestart)?有线索吗?

我知道这段代码是基于弃用的技术。但是我想在开始担心创建Loaders之前让它工作。

任何帮助将不胜感激。我有......

public class MainActivity extends Activity implements ...{
    private ListView logView;
    private SQLiteDatabase db;
    private DBAdapter dbAdapter;
    private Cursor cursor;
    private SimpleCursorAdapter logAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
    }
    @Override
    protected void onStart() {
        super.onStart();
        ... 
    }
    @Override
    protected void onRestart() {
        super.onRestart();
    }

    @Override
    protected void onResume() {
        super.onResume();
        dbAdapter = new DBAdapter(this);
        db = dbAdapter.getReadableDatabase();

        cursor = db.query("log", null, null, null, null, null, "_id ASC");
        startManagingCursor(cursor);
        Log.i(TAG, "cursor="+cursor.toString());

        String[] from = { "entry"}; 
        int[] to = { R.id.row_entry }; 
        logAdapter = new SimpleCursorAdapter(this, R.layout.log_row, cursor, from, to);
        logView.setAdapter(logAdapter);

        logAdapter.notifyDataSetChanged();      
        logView.setSelection(logView.getCount()-1);
    }

    @Override
    protected void onPause() {
        super.onPause();
    }

    @Override
    protected void onStop() {
        super.onStop();
    }

    ...
}

1 个答案:

答案 0 :(得分:0)

尝试这样的事情:

在onResume()中

    if(db==null) db=dbAdapter.getReadableDatabase();

和onPause()

    if(db!=null) { db.close; db=null; }

另外我认为你应该详细研究这篇文章,它会让你坚持这个问题以及你将要构建的每个下一个应用程序。 http://developer.android.com/reference/android/app/Activity.html

它有一个活动生命周期图。通过这种方式,您将知道何时onResume,onPause被调用等,您将知道放置代码的位置。

这里也是一样,但我想有更多解释:http://developer.android.com/training/basics/activity-lifecycle/starting.html