Android sqlite в службах

Я использую sqlite в своем приложении. Он работает нормально, но в сервисах не работает, и я получаю сообщение об ошибке:

Caused by: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database

мой код:

public class LocalServiceWakeUp extends Service {

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // Query the database and show alarm if it applies
        super.onStartCommand(intent, flags, startId);

    dbHelper = new DbHelper(getApplicationContext());

    SQLiteDatabase sqLiteDatabase = dbHelper. getReadableDatabase();

            String sql = "SELECT * FROM " +
                    DataEntry.DbEntry.TABLE_NAME + " " +
                    "ORDER BY " + DataEntry.DbEntry._ID + " ASC";

            cursor = sqLiteDatabase.rawQuery(sqLiteDatabase , ql);
    }
}
public class DbHelper extends SQLiteOpenHelper {
public DbHelper(Context context) {
        super(context, DataEntry.DbEntry.DATABASE_NAME, null, DataEntry.DbEntry.DATABASE_VERSION);

DbHelper.context = context;
}

Я думаю, что проблема в контексте. Если я попытаюсь распечатать конус, я вижу:

android.support.multidex.MultiDexApplication@8cd270b

Как решить проблему?

Большое спасибо

Опубликованный вами код кажется недействительным - как далеко он от вашего фактического кода? В частности, открываете ли вы свою базу данных при инициализации значений полей службы?

laalto 23.04.2018 21:21

Ваш сервис работает в другом процессе?

Viktor Yakunin 23.04.2018 22:18

Не храните контекст в статических переменных, это утечка памяти, а также может быть корнем вашей проблемы.

m0skit0 23.04.2018 22:19

Да, я открываю базу данных при инициализации службы. Этот код отлично работает с активностью (я открываю db в функции oncreate). Как поменять код? Когда мне нужно открыть БД? @viktor да, я запускаю службу с приемником

user3576455 23.04.2018 22:20

Я не использую контекст в статической переменной, я использую функцию getapplicationcontext ()

user3576455 23.04.2018 22:24
DbHelper.context = context;
m0skit0 23.04.2018 23:20

проблема не в DbHelper.context = context;, я пытался удалить ее, но проблема та же android.database.sqlite.SQLiteCantOpenDatabaseException: неизвестная ошибка (код 14): не удалось открыть базу данных

user3576455 24.04.2018 07:38
0
7
502
2

Ответы 2

В классе DbHelper используйте это:

public Cursor getAllAlarms() {
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor res = db.rawQuery(SQL_SELECT_ALL_ALARMS, null);
    return res;
}

Создайте класс, чтобы помочь себе в использовании этих методов:

public class AlarmHelper {

public static ArrayList<Alarm> getAlarmsFromDatabase(Context context) {
    ArrayList<Alarm> alarms = new ArrayList<>();
    FeedReaderDbHelper myDb = new FeedReaderDbHelper(context);
    Cursor cursor = myDb.getAllAlarms();
    if (cursor.getCount() > 0) {
        while (cursor.moveToNext()) {
            Alarm alarm = new Alarm();
            alarm.setId(cursor.getString(0));
            alarm.setTime(cursor.getString(1));
            alarm.setStatus(cursor.getString(2));
            alarms.add(alarm);
        }
    }
    myDb.close();
    return alarms;
}

Итак, на вашем сервисе у вас будет только это, чтобы получать свои будильники:

public class LocalServiceWakeUp extends Service {

  private Context context;

  public AlarmService() {
  }

  @Override
  public void onCreate() {
      super.onCreate();
      context = getApplicationContext();
  }

  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {

      ArrayList<Alarm> alarms = AlarmHelper.getAlarmsFromDatabase(context);

      //TODO YOUR CODE HERE

  }
}

проблема в манифесте. Я добавил 2 строки в служебный тег android: isolatedProcess = "true" android: stopWithTask = "false", без этой строки он работает. Но как сохранить службу после того, как приложение будет убито?

user3576455 24.04.2018 14:59

да, вы пытались покинуть мэйнфест только с этим? <service android: name = ". services.LocalService" /> Я предполагаю, что вы убиваете контекст, поэтому он не может получить доступ к вашему методу getApplicationContext () после его уничтожения. Вы пробовали использовать базу данных Firebase? Он работает и в автономном режиме

Gaspar 24.04.2018 22:52

Проблема в манифесте. я добавил

android:isolatedProcess = "true"
android:stopWithTask = "false"

на сервисном теге:

<service
android:name = ".services.LocalService"
android:enabled = "true"
android:isolatedProcess = "true"
android:stopWithTask = "false" />

Если я удалю строку android: isolatedProcess и android: stopWithTask, она будет работать, но если я убью приложение, служба также будет убита.

Как решить проблему? У меня вопрос, как сохранить службу после того, как приложение было убито?

Большое спасибо

Другие вопросы по теме