как разрешить ошибку базы данных не открыть, когда я использую SQliteDbHelper? - PullRequest
0 голосов
/ 01 марта 2012

Я реализовал приложение с помощью Activty, Service, SQLiteOpenHelper. В моем приложении я получаю данные из класса обслуживания и отправляю в класс SQLiteOpenHelper, этот класс сохраняет данные в SQlite db, и я извлекаю данные из этого Класс SQLiteOpenHelper для класса Activity с помощью SimpleCurserAdapeter с последующим обновлением до ListView. Я использовал структуру кода следующим образом:

MyActivity.java

   @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.testlist);
    IntentFilter filter = new IntentFilter("com.sample.presentationLayer");
    registerReceiver(myReceiver, filter);
    startService(new Intent(MyActivity.this, RepeatService.class));
}   
   private BroadcastReceiver myReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
        objSqlite= new MySqliteHelper(MyActivity.this);
        objSqlite.openToWrite();
        lst = ((ListView)findViewById(R.id.listView1));
        cursor = objSqlite.queueAll();
        getFromDB = new String[]{MySqliteHelper.KEY_CONTENT2,MySqliteHelper.KEY_CONTENT3};
        toView = new int[]{R.id.usrName,R.id.msgText};
        lst.setAdapter(new SimpleCursorAdapter(NewShoutGetMessagesScrn.this, R.layout.test, cursor, getFromDB, toView));
        updateList();

        }
    };

  @Override
protected void onDestroy() {
    super.onDestroy();
    stopService(new Intent(MyActivity.this, RepeatService.class)); 
    unregisterReceiver(myReceiver);
     if(objSqlite.isOpen) { 
   objSqlite.deleteAll(); 
   objSqlite.close();
}

}

RepeatService.java

 private Timer timer = new Timer();
 private static final long UPDATE_INTERVAL = 20000;
 private MySqliteHelper objSqlite;

 @Override
public void onCreate() {

    objSqlite = new MySqliteHelper(RepeatService.this);
    objSqlite.openToWrite();
   pollForUpdates();
    super.onCreate();
}


 private void pollForUpdates() {

       timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
                 for(int i=0;i<result.size();i++)
       {   

                 String userID = result.get(i).getUserID();
       String userName = result.get(i).getName();
    String userMessage=result.get(i).getMessageText();

         objSqlite.insert(userID, userName, userMessage);
          Intent intent = new Intent();
                intent.setAction("com.sample.presentationLayer");
                sendBroadcast(intent); // finally broadcast
        }
    }, 0, UPDATE_INTERVAL);
      }


  @Override
public void onDestroy() {
    timer.cancel();
     if(objSqlite.isOpen) { 
             objSqlite.deleteAll(); 
             objSqlite.close();
          }
}      

MySqliteHelper.java

   private Context context;

  public MySqliteHelper(Context c){
   context = c;
  }

 public MySqliteHelper openToRead() throws android.database.SQLException {
 sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION);
 sqLiteDatabase = sqLiteHelper.getReadableDatabase();
 return this; 
 }

 public MySqliteHelper openToWrite() throws android.database.SQLException {
 sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION);
 sqLiteDatabase = sqLiteHelper.getWritableDatabase();
 return this; 
}

public void close(){
  sqLiteHelper.close();
}

public long insert(String content1, String content2,String content3){

ContentValues contentValues = new ContentValues();
contentValues.put(USER_ID, content1);
contentValues.put(USER_NAME, content2);
contentValues.put(USER_MESSAGE, content3);
return sqLiteDatabase.insert(MYDATABASE_TABLE, null, contentValues);
}

 public int deleteAll(){
   return sqLiteDatabase.delete(MYDATABASE_TABLE, null, null);
 }

public Cursor queueAll(){
 String[] columns = new String[]{KEY_ID, USER_ID, USER_NAME, USER_MESSAGE};
 Cursor cursor = sqLiteDatabase.query(MYDATABASE_TABLE, columns,
 null, null, null, null, "_id DESC");
cursor.moveToFirst();
return cursor;
 }


 public class SQLiteHelper extends SQLiteOpenHelper {

public SQLiteHelper(Context context, String name,
 CursorFactory factory, int version) {
super(context, name, factory, version);
}

@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
 db.execSQL(SCRIPT_CREATE_DATABASE);
}

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

}

Из приведенного выше кода при выходе из приложения я получаю сообщение об ошибке:

  03-01 16:11:47.468: ERROR/AndroidRuntime(3038): Uncaught handler: thread main exiting due   to uncaught exception
  03-01 16:11:47.478: ERROR/AndroidRuntime(3038): java.lang.RuntimeException: Unable to destroy activity {com.sample.presentationLayer/com.sample.presentationLayer.MyActivity}: java.lang.IllegalStateException: database not open
  03-01 16:11:47.478: ERROR/AndroidRuntime(3038):     at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3364)
  03-01 16:11:47.478: ERROR/AndroidRuntime(3038):     at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3382)
  03-01 16:11:47.478: ERROR/AndroidRuntime(3038):     at android.app.ActivityThread.access$2700(ActivityThread.java:116)
  03-01 16:11:47.478: ERROR/AndroidRuntime(3038):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1826)
   03-01 16:11:47.478: ERROR/AndroidRuntime(3038):     at android.os.Handler.dispatchMessage(Handler.java:99)
   03-01 16:11:47.478: ERROR/AndroidRuntime(3038):     at android.os.Looper.loop(Looper.java:123)
   03-01 16:11:47.478: ERROR/AndroidRuntime(3038):     at android.app.ActivityThread.main(ActivityThread.java:4203)
   03-01 16:11:47.478: ERROR/AndroidRuntime(3038):     at java.lang.reflect.Method.invokeNative(Native Method)
   03-01 16:11:47.478: ERROR/AndroidRuntime(3038):     at java.lang.reflect.Method.invoke(Method.java:521)
  03-01 16:11:47.478: ERROR/AndroidRuntime(3038):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
  03-01 16:11:47.478: ERROR/AndroidRuntime(3038):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
  03-01 16:11:47.478: ERROR/AndroidRuntime(3038):     at dalvik.system.NativeStart.main(Native Method)
  03-01 16:11:47.478: ERROR/AndroidRuntime(3038): Caused by: java.lang.IllegalStateException: database not open
  03-01 16:11:47.478: ERROR/AndroidRuntime(3038):     at android.database.sqlite.SQLiteDatabase.delete(SQLiteDatabase.java:1348)
  03-01 16:11:47.478: ERROR/AndroidRuntime(3038):     at com.fitzgerald.shoutdataLayer.MySqliteHelper.deleteAll(MySqliteHelper.java:65)
 03-01 16:11:47.478: ERROR/AndroidRuntime(3038):     at com.fitzgerald.presentationLayer.NewShoutGetMessagesScrn.onDestroy(MyActivity.java:58)
 03-01 16:11:47.478: ERROR/AndroidRuntime(3038):     at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3351)
 03-01 16:11:47.478: ERROR/AndroidRuntime(3038):     ... 11 more

Как я могу устранить вышеуказанную ошибку? и таймер не отменяет ...

1 Ответ

1 голос
/ 01 марта 2012

В методе onDestroy() вы сначала закрываете базу данных, затем пытаетесь удалить записи (как в действии, так и в службе).Попробуйте это:

objSqlite.deleteAll();
objSqlite.close();

Редактировать: Другой источник вашей проблемы может заключаться в том, что в onDestroy() методе вашего Activity MyActivity.java вы первыйвызов:

stopService(new Intent(MyActivity.this, RepeatService.class)); 

, который вызывает метод onDestroy() службы.В этом методе вы удаляете записи, а затем закрываете базу данных.После этого вы возвращаетесь к методу onDestroy(), в котором снова пытаетесь удалить записи (но база данных закрыта от службы), а затем снова закрываете базу данных.В упражнении onDestroy попробуйте сначала проверить, открыта ли база данных, прежде чем пытаться удалить все записи:

@Override
protected void onDestroy() {
    super.onDestroy();
    stopService(new Intent(MyActivity.this, RepeatService.class)); 
    unregisterReceiver(myReceiver);
    if(objSqlite.isOpen) { 
       objSqlite.deleteAll(); 
       objSqlite.close();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...