Gettine异常:java.lang.IllegalStateException:数据库未打开

时间:2013-04-09 04:30:32

标签: android android-sqlite

虽然这是一个常见错误,但可能有很多与此异常相关的帖子。但这是奇怪的情况。我在Android 2.2中获得java.lang.IllegalStateException: database not open例外。在剩下的手机中它运作良好。

logcat的:

java.lang.IllegalStateException: database not open
at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1291)
at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1251)
at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1331)
at com.mythrii.ilpa.DataHelper.checkRating(DataHelper.java:126)
at com.mythrii.ilpa.SplashActivity$1.run(SplashActivity.java:35)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:144)
at android.app.ActivityThread.main(ActivityThread.java:4937)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
at dalvik.system.NativeStart.main(Native Method)

我的代码:

public class SplashActivity extends ActivityHelper
{
private DataHelper dh;
// Set the display time, in milliseconds (or extract it out as a configurable parameter)
private final int SPLASH_DISPLAY_LENGTH = 3000;
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.act__splash);

    dh = new DataHelper(this);

    dh.inserORupdateRating();
}

protected void onResume()
{
    super.onResume();

        new Handler().postDelayed(new Runnable()
        {
            public void run()
            {
                clearPref();
                PrefBoolEdit("rating",dh.checkRating());//=> Here is the exception
                SplashActivity.this.finish();
                Intent mainIntent = new Intent(SplashActivity.this, HomeActivity.class);
                SplashActivity.this.startActivity(mainIntent);
            }
        }, SPLASH_DISPLAY_LENGTH);

}

protected void onDestroy() 
{
    super.onDestroy();
    if (dh != null) 
    {
        dh.close();
    }
}
}

我正在使用此构造函数来调用每个活动

Datahelper

 public DataHelper(Context context) 
   {

      this.context  =   context;
      openHelper    =   new OpenHelper(this.context);
      this.db       =   openHelper.getWritableDatabase();

      Calendar c = Calendar.getInstance();    
      formattedDate = df.format(c.getTime());
   }

CheckRating

   public boolean checkRating()
   {
       Cursor cursor = this.db.query(TABLE_NAME_1, new String[] { "option" },
               null, null, null, null, null);

       String option = null;
       //String date = null;

       boolean bool = false;

       if (cursor.moveToFirst())
          {
              do {
                  //date     = cursor.getString(0);
                  option = cursor.getString(0);

               } while (cursor.moveToNext());
          }
          if (cursor != null && !cursor.isClosed()) {
              cursor.close();
          }

          if(getRateCount()>0)
          {
              if(!option.equals(ALREADY_RATED))
              {
                  bool = true;
              }
              else 
              {
                  bool = false;
              }
          }
          else 
          {
                bool = false;
          }  
       return bool;
   }

请有人帮帮我..

2 个答案:

答案 0 :(得分:3)

在执行任何操作之前,您应该打开数据库

dh.open();

See this one   和 also this one

答案 1 :(得分:0)

这可能有助于您创建SQLiteOpenHelper

package org.groundme.sqlite;

import org.groundme.general.General;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class TaskDatabaseHelper extends SQLiteOpenHelper {

 public static final String TAG = "TaskDatabaseHelper";
 public static final String DATABASE_NAME = "MyTask.db";
 public static final int DATABASE_VERSION = 9;

 public static final String TABLE_NAME = "tasklist";
 public static String ID="id";
 public static final String TASK_TITLE = "task_title";
 public static final String TASK_DESC = "task_desc";
 public static final String TASK_DATE = "task_date";
 public static final String TASK_TIME = "task_time";
 public static final String TASK_LOCATION = "task_location";
 public static final String TASK_LAT = "task_lat";
 public static final String TASK_LNG = "task_lng";
 public static final String TASK_STATUS = "status";
 public static final String TASK_TLBASE = "timeloc_base";
 public static final String TASK_DURATION = "task_duration";


 private static final String DATABASE_CREATE = "create table " + TABLE_NAME + "(" + 
   ID + " integer primary key autoincrement ," + 
   TASK_TITLE + " text," +
   TASK_DESC + " text," + 
   TASK_DATE + " text," + 
   TASK_TIME + " text," + 
   TASK_LOCATION + " text ," + 
   TASK_LAT + " text ," + 
   TASK_LNG + " text ," +
   TASK_STATUS + " text ," +
   TASK_TLBASE + " INTEGER default 0," +
   TASK_DURATION + " text)";

 public TaskDatabaseHelper(Context context) {
  super(context, DATABASE_NAME, null, DATABASE_VERSION);
  // TODO Auto-generated constructor stub
  Log.i(General.TAG, TAG + "constructer");
 }

 @Override
 public void onCreate(SQLiteDatabase db) {
  // TODO Auto-generated method stub

  Log.i(General.TAG, TAG + "oncreate");
  db.execSQL(DATABASE_CREATE);

 }

 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  // TODO Auto-generated method stub

  db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
  onCreate(db);

 }         

}

并打开课程并在今年五月帮助你。

public class TaskData {
public TaskData(Context ctx) {
  Log.i(General.TAG, TAG + "TaskData");
  taskdbhelper = new TaskDatabaseHelper(ctx);

}

public void open() throws SQLException {

  Log.i(General.TAG, TAG + "open");
  if (sqlitedb == null) {   
   sqlitedb = taskdbhelper.getWritableDatabase();
  }
 }

}

通过创建TaskData object,您可以创建您的上下文,在这里您还可以更新,插入,删除函数传递以供进一步使用。