2016-04-15 1 views
1

Правильно я получаю уведомление от GCM, но я хочу вставить это сообщение в локальную базу данных (sqlite).Данные ввода, когда вы получаете push-уведомление от GCM, и ваше приложение не было запущено

Если я получаю уведомление, когда мое приложение не запущено, оно не вставляет сообщение, но если мое приложение работает, то оно делает.

Могу ли я получить доступ к базе данных sqlite, когда мое приложение не работает?

ответ

0

Ваш метод DataAccess.InsertDownload() в вашем общем коде? Если это так, это то же самое, с чем я столкнулся.

Возможно, это не лучший способ решить эту проблему, но я должен был сохранить строку JSON в Android SharedPreferences, если приложение действительно закрыто. Затем приложение загружается снова, в пределах MainActivity и после загрузки совместного проекта я пытаюсь прочитать любые SharedPreferences и сохранить их в БД.

Ниже приведен код, показывающий это. Here является ссылкой на SettingsImplementation.

public async Task SaveNotifToDb(Notification notification) { 
    try { 
     DataAccess.InsertDownload (message); 
    } catch(System.InvalidOperationException) { //InvalidOperationException is the exception given when your shared code is not yet loaded, meaning the app is closed, so now lets save to Preferences 
     System.Console.WriteLine("\nIn APP.Droid.Helpers.GcmService.SaveNotificationAsync() - InvalidOperationException, the app is probably closed. Saving to Shared Preferences\n"); 

     string notificationJson = Newtonsoft.Json.JsonConvert.SerializeObject(notification); 

     string emptyCheck = SettingsImplementation.GetValueOrDefault<string>(DroidConstants.NotificationSettingKeyPart + "0", DroidConstants.NotificationSettingDefault); 

     if(emptyCheck.Length > 0) { 

      int index = 0; 

      while(emptyCheck.Length > 0) { 
       emptyCheck = SettingsImplementation.GetValueOrDefault<string>(DroidConstants.NotificationSettingKeyPart + index.ToString(), DroidConstants.NotificationSettingDefault); 
       index ++; 
      } 

      SettingsImplementation.AddOrUpdateValue<string>(DroidConstants.NotificationSettingKeyPart + (index - 1).ToString(), notificationJson); 
     } else { SettingsImplementation.AddOrUpdateValue<string>(DroidConstants.NotificationSettingKeyPart + "0", notificationJson); } 

     return notification; 
    } 
} 

Теперь, когда приложение запускается, мы ждем общий код для загрузки, а затем попытаться прочитать все JSON уведомления обратно.

MainActivity.OnCreate():

base.OnCreate(bundle); 
Xamarin.Forms.Forms.Init(this, bundle); 

string notificationJson = SettingsImplementation.GetValueOrDefault(DroidConstants.NotificationSettingKeyPart + "0", DroidConstants.NotificationSettingDefault); //Check to see if we have a saved notification 

    if(notificationJson.Length > 0) { 

     int index = 0; 

     while(notificationJson.Length > 0) { //Keep trying until no more notifications can be gatherd 
      notificationJson = SettingsImplementation.GetValueOrDefault(DroidConstants.NotificationSettingKeyPart + index, DroidConstants.NotificationSettingDefault); 

      if(notificationJson.Length > 0) { 

       Data.Models.RemoteNotification notification = Newtonsoft.Json.JsonConvert.DeserializeObject<Data.Models.RemoteNotification>(notificationJson); 

       if(notification != null) { 

        try { 
         await App.RemoteNotificationRepo.InsertAsync(notification); 
        } catch(System.Exception e) { 
         System.Console.WriteLine("\nIn APP.Droid.MainActivity.OnCreate() - Exception attempting to create new in app notification\n{0}\n", e); 
        } 
       } 

       SettingsImplementation.Remove(DroidConstants.NotificationSettingKeyPart + index.ToString()); 

       index++; 
      } 
     } 
    } 
0

Да. Вы можете получить доступ к Sqlite, если приложение не запущено. В OnCreate вашей деятельности вы можете проверить новые сообщения и соответственно обновить их.

Смежные вопросы