Я использую 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
Как решить проблему?
Большое спасибо
Ваш сервис работает в другом процессе?
Не храните контекст в статических переменных, это утечка памяти, а также может быть корнем вашей проблемы.
Да, я открываю базу данных при инициализации службы. Этот код отлично работает с активностью (я открываю db в функции oncreate). Как поменять код? Когда мне нужно открыть БД? @viktor да, я запускаю службу с приемником
Я не использую контекст в статической переменной, я использую функцию getapplicationcontext ()
DbHelper.context = context;проблема не в DbHelper.context = context;, я пытался удалить ее, но проблема та же android.database.sqlite.SQLiteCantOpenDatabaseException: неизвестная ошибка (код 14): не удалось открыть базу данных
В классе 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", без этой строки он работает. Но как сохранить службу после того, как приложение будет убито?
да, вы пытались покинуть мэйнфест только с этим? <service android: name = ". services.LocalService" /> Я предполагаю, что вы убиваете контекст, поэтому он не может получить доступ к вашему методу getApplicationContext () после его уничтожения. Вы пробовали использовать базу данных Firebase? Он работает и в автономном режиме
Проблема в манифесте. я добавил
android:isolatedProcess = "true"
android:stopWithTask = "false"
на сервисном теге:
<service
android:name = ".services.LocalService"
android:enabled = "true"
android:isolatedProcess = "true"
android:stopWithTask = "false" />
Если я удалю строку android: isolatedProcess и android: stopWithTask, она будет работать, но если я убью приложение, служба также будет убита.
Как решить проблему? У меня вопрос, как сохранить службу после того, как приложение было убито?
Большое спасибо
Опубликованный вами код кажется недействительным - как далеко он от вашего фактического кода? В частности, открываете ли вы свою базу данных при инициализации значений полей службы?